shell
跟新于 2022-01-08
变量
条件变量
特殊变量
| 参数 | 说明 |
|---|---|
| $0 | shell本身文件名 |
| $? | 最后运行命令的返回值 |
| $! | shell最后运行的后台process的PID |
| $$ | shell本身的pid |
| $# | shell的参数个数 |
| $@ | 所有参数列表,以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个 |
| $* | 所有参数列表,以"$1" "$2" … "$n" 的形式输出所有参数 |
if
基本语法:
shell
if [ command ];then
cmd
elif [ command ];then
cmd
else
cmd
fi判断文件/文件夹(目录)
| 判断 | 说明 |
|---|---|
| [ -b FILE ] | 如果 FILE 存在且是一个块特殊文件则为真 |
| [ -c FILE ] | 如果 FILE 存在且是一个字特殊文件则为真 |
| [ -d DIR ] | 如果 FILE 存在且是一个目录则为真 |
| [ -e FILE ] | 如果 FILE 存在则为真 |
| [ -f FILE ] | 如果 FILE 存在且是一个普通文件则为真 |
| [ -g FILE ] | 如果 FILE 存在且已经设置了SGID则为真 |
| [ -k FILE ] | 如果 FILE 存在且已经设置了粘制位则为真 |
| [ -p FILE ] | 如果 FILE 存在且是一个名字管道(F如果O)则为真 |
| [ -r FILE ] | 如果 FILE 存在且是可读的则为真 |
| [ -s FILE ] | 如果 FILE 存在且大小不为0则为真 |
| [ -t FD ] | 如果文件描述符 FD 打开且指向一个终端则为真 |
| [ -u FILE ] | 如果 FILE 存在且设置了SUID (set user ID)则为真 |
| [ -w FILE ] | 如果 FILE存在且是可写的则为真 |
| [ -x FILE ] | 如果 FILE 存在且是可执行的则为真 |
| [ -O FILE ] | 如果 FILE 存在且属有效用户ID则为真 |
| [ -G FILE ] | 如果 FILE 存在且属有效用户组则为真 |
| [ -L FILE ] | 如果 FILE 存在且是一个符号连接则为真 |
| [ -N FILE ] | 如果 FILE 存在且最后一次读取之后未被修改则为真 |
| [ -S FILE ] | 如果 FILE 存在且是一个套接字则为真 |
| [ FILE1 -nt FILE2 ] | 如果FILE1比FILE2新,或FILE1存在而FILE2不存在则为真 |
| [ FILE1 -ot FILE2 ] | 如果FILE2比FILE1新,或FILE2存在且FILE1不存在则为真 |
| [ FILE1 -ef FILE2 ] | 如果FILE1和FILE2 指向相同的设备和节点号则为真 |
判断字符串
| 判断 | 说明 |
|---|---|
| [ -z STRING ] | 如果STRING的长度为零则为真 |
| [ -n STRING ] | 如果STRING的长度非零则为真 |
| [ STRING1 = STRING2 ] | 如果两个字符串相同则为真 |
| [ STRING1 != STRING2 ] | 如果字符串不相同则为真 |
| [ STRING1 ] | 如果字符串不为空则为真 |
数值判断
| 判断 | 说明 |
|---|---|
| INT1 -eq INT2 | INT1和INT2两数相等为真 |
| INT1 -ne INT2 | INT1和INT2两数不等为真 |
| INT1 -gt INT2 | INT1大于INT1为真 |
| INT1 -ge INT2 | INT1大于等于INT2为真 |
| INT1 -lt INT2 | INT1小于INT2为真 |
| INT1 -le INT2 | INT1小于等于INT2为真 |
复杂逻辑判断
| 符号 | 含义 |
|---|---|
| -a | 逻辑与 |
| -o | 逻辑或 |
| ! | 逻辑非 |
shell
#exp1: 如果a>b且a
if (( a > b )) && (( a < c ))
#或者
if [[ $a > $b ]] && [[ $a < $c ]]
#或者
if [ $a -gt $b -a $a -lt $c ]
#exp2:如果a>b或a
if (( a > b )) || (( a < c ))
#或者
if [[ $a > $b ]] || [[ $a < $c ]]
#或者
if [ $a -gt $b -o $a -lt $c ]case
shell
case value in
value1)
command
...
;;
value2)
command1
...
;;
esac