一. 变量
变量类型
1. 自定义变量
定义变量: 变量名=变量值, 区分大小写
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量: 包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效
2. 环境变量
定义环境变量: 方法一 export 变量名=变量值
方法二export 变量名, 将自定义变量转换为环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env
取消环境变量: unset 变量名
变量作用范围: 当前shell和子shell有效
扩展
静态变量: redonly 变量名=变量值
声明静态变量:readonly 变量,注意:不能 unset
3. 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
4. 预定义变量
| 变量 | 意义 |
|---|---|
| $0 | 脚本名 |
| $* | 所有参数 |
| [email protected] | 所有参数 |
| $# | 参数的个数 |
| $$ | 当前进程的PID |
| $! | 上一个后台进程的PID |
| $? | 上一个命令的返回值, 0表示成功, 其他均为失败 |
变量赋值方式
1. 显式赋值
变量名=变量值
ip=1.1.1.1
school="zhong guo"
today=`date+%F` 这句话时将date+%F这条命令的执行结果赋值给today
today=$(date+%F) 这句话时将date+%F这条命令的执行结果赋值给today
2. 键盘读入
read 变量名
read -p “提示信息” 变量名 在键盘录入的时候显示提示信息
read -t 5 -p “提示信息” 变量名 -t 5 代表等待五秒钟, 超时不候
read -n 2 变量名 -n 2 表示输入两个字符
引用变量注意
" " 弱引用 里面可以加变量
’ ’ 强引用 一切皆为字符串
` ` 命令替换 命令会被先执行
$() 命令替换 命令会被先执行
变量的运算
1. 整数运算
2. 小数运算
小数运算要加scale值, 来保留小数的位数
echo “scale=2;6/4” |bc 用scale保留小数位
awk ‘BEGIN{print 1/2}’ 用awk命令运算
echo “print 5.0/2” |python 用python运算
变量内容替换和删除
1. 内容删除
2. 内容替换
3. 变量替代
总结
| 格式 | 符号 | 说明 |
|---|---|---|
| ${var-string} | - | 只替换没有定义的变量 |
| ${var:-string} | :- | 替换没有定义和是空值的变量 |
| ${var+string} | + | 不替换没有定义的变量 |
| ${var:+string} | :+ | 仅替换有值的变量 |
| ${var=string} | = | 不替换空值的变量 |
| ${var:=string} | := | 不替换有值的变量 |
| ${var?string} | ? | 未定义变量抛出异常 |
| ${var:?string} | :? | 未定义变量和空值均抛出异常 |
二. 条件测试
格式1: test条件表达式
格式2: [ 条件表达式]
格式3: [[ 条件表达式 ]]
"[" 是一个命令, 空格和参数隔开
文件测试
| 操作符 | 说明 |
|---|---|
| -e file | 文件是否存在 |
| -d file | 是否为目录 |
| -f file | 是否为文件 |
| -b file | 是否为设备文件 |
| -c file | 是否为字符设备文件 |
| -r file | 是否可读 |
| -w file | 是否可写 |
| -x file | 是否可执行 |
| -L file | 是否是链接文件 |
| -s file | 是否为空 空返回false |
数值比较
| 操作符 | 说明 |
|---|---|
| -gt | 大于 |
| -lt | 小于 |
| -eq | 等于 |
| -ne | 不等于 |
| -ge | 大于等于 |
| -le | 小于等于 |
字符串比较
字符串定义时务必加双引号
[ -z “$var”] 字符串长度是为0
[ -n “$var”] 字符串长度不为0
字符串比较用"="
脚本执行调试
执行
./01.sh 需要执行权限, 在子shell中执行
bash 01.sh 不需要执行权限, 在子shell中执行
. 01.sh 不需要执行权限, 在当前shell中执行
source 01.sh 不需要执行权限, 在当前shell中执行
调试
sh -n 02.sh 仅调试, 检测错误
sh -vx 02.sh 以调试的方式执行, 查询整个执行过程