一、脚本
1、shell组成
#!脚本声明(使用哪种解释器)
# 注释信息
脚本内容
注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:
#!/bin/env 解释器
#!/bin/env bash
2、执行脚本方式
sh -x 脚本文件路径
source 脚本文件路径
. 脚本文件绝对路径
二、变量
1、什么是变量
- 变量:内存空间,命名的内存空间
- 内存:编址的存储单元
- 进程:程序执行起来成为进程,进程的数据存储在内存当中,进程执行过程中需要临时存储数据需要变量。
eg:
1、计算机计算1+100
在内存中分出100个空间存储100个整数,让运算器挨个取它加起来。
2、计算机计算1+100万
对一个内存空间设为变量,它会一直变化。
2、引用变量值
$变量名
3、查看变量名
echo $变量名
echo ${变量名}
4、取消变量名
unset 变量名
5、变量的类型
按存储类型:决定数据存储的格式和长度。
- 整数型
- 浮点型
- 字符型
- 双精度浮点型
按使用类型:
- 环境变量:变量名通常都大小写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改
- 位置变量:bash内置,存储执行脚本时提供的参数
- 预定义变量:bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改
- 自定义变量(本地变量):由用户自主设置、修改及使用
三、变量详解
1、环境变量
1)按生效的范围分类。
- 系统环境变量:公共的,对全部的用户都生效。
- 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。
2)按生存周期分类。
- 永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
- 临时环境变量:使用时在Shell中临时定义,退出Shell后失效。
永久生效:
配置文件:/etc/profile、 ~/.bash_profile
相关操作:
env:列出当前用户所有的环境变量
set:列出当前用户所有变量
export:变量名=变量值 或者 变量名=变量值;export 变量名
常见的环境变量:
PWD、PATH、USER、LOGNAME、UID、SHELL、HOME、PS1、PS2、…
# AAA=NIHAO
# env | grep AAA
# export AAA
# env | grep AAA
AAA=NIHAO
2、系统变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用。
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误 |
$0 | 当前执行的程序或脚本名 (./02.sh) |
$# | 脚本后面接的参数的个数 3个 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 (参数数组a b c) |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 (参数数组a b c) |
$1~$9 | 脚本后面的位置参数,$1表示第1个位置参数,依次类推 |
${10}~$ | 位置变量,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来) |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号 测试: sleep 400 &(后台运行)/sleep 400(ctrl+z 暂停运行), 再运行jobs, 查看当前进程的后台子进程. |
!$ | 调用最后一条命令历史中的参数 |
# cat variable.sh
#!/bin/bash
echo "列出脚本系统变量"
echo "\$0 = $0" # "\" 是转译的意思,是字符串
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$3 = $3"
echo "\$10 = ${10}"
3、自定义变量
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。
[root@scp1 ~]# A=hello
[root@scp1 ~]# psPID TTY TIME CMD
78656 pts/0 00:00:00 bash
78793 pts/0 00:00:00 ps
[root@scp1 ~]# echo $A
hello
[root@scp1 ~]# su user1
[user1@scp1 root]$ psPID TTY TIME CMD
78885 pts/0 00:00:00 bash
78917 pts/0 00:00:00 ps
[user1@scp1 root]$ echo $A
4、全局变量
全局变量:全局所有的用户和程序都能调用(文件配置),且继承,新建的用户也默认能调用。
解读相关配置文件
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名、umask、函数等 $HOME:用户的家目录 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
$HOME/.bash_logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
$HOME/.bash_history | 用户的历史命令 | history -w 保存历史记录 history -c 清空历史记录 |
说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。
用户登录系统后, 读取相关文件的顺序
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- /etc/bashrc
- $HOME/.bash_logout
四、变量值及范围控制
1、三种定界符
注意:$()与
等效,但$()更方便嵌套使用
2、变量的作用范围
局部变量:
- 新定义的变量默认只在当前shell环境中有效
- 无法在子shell环境中使用
全局变量:
- 全局变量在当前shell及子shell环境中均有效
- 使用export可将局部变量声明为全局变量
- export 局部变量名 :为局部变量添加全局属性
- export -n 全局变量名 : 取消指定变量的全局属性
五、交互式定义变量
read 标准输入取值(用户自己输入变量值)
目的:read从键盘读入变量值完成赋值
语法:read 选项 变量名
选项 | 释义 |
---|---|
-p | 提示用户的信息 |
-n | 限制变量值的长度 |
-s | 不显示用户输入的内容 |
-t | 限制用户输入变量值的超时时间 |
六、定义变量的类型
declare 选项 变量名=变量值
选项 | 释义 | 举例 |
---|---|---|
-i | 将变量看成整数 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=HELLO |
-a | 定义普通数组 | |
-A | 定义关联数组 | |
-x | 将变量通过环境导出 | declare -x C=666 export C=666 |
扩展:只读变量
[root@scp1 ~]# name=libai
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# readonly name
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# name=lili
-bash: name: 只读变量