0x00 if-then
格式
if command
then
commands
fi
## shell编程的if判断条件与其他语言不同,条件处填写command(命令)
## 如果command执行后返回0(正确执行),则执行then后语句
## fi结束标志
另一种格式
if command;then
commands
fi
0x01 if-then-else
格式
if command
then
commands
else
commands
fi
## shell编程的if判断条件与其他语言不同,条件处填写command(命令)
## 如果command执行后返回0(正确执行),则执行then后语句
## 如果command执行后返回非0(执行失败),则执行else后的语句
## fi结束标志
另一种格式
if command;then
commands
else
commands
fi
0x02 嵌套if
格式
if command
then
commands
elif command
then
commands
fi
0x03 test命令
shell中的if语句只可以判断命令返回状态值,无法做到判断条件
但是test命令却可以做到对条件的判断
test判断的条件为True时,返回状态值为 0 (正确执行)
test判断的条件为False时,返回状态值为 非0 (执行失败)
结合if语句可以得出,如下语法:
if test condition
then
commands
fi
## condition为判断条件
另一种方法
除了可以使用test命令还可以,还有如下方式:
if [ condition ]
then
commands
fi
## 注意严格按照
##[ condition ]
## 格式
## 注意[]和condition之间的空格
## 否则会报错
0x04 数值比较
比较 | 描述 |
---|---|
n1 -eq n2 | 检查n1是否等于n2 |
n1 -lt n2 | 检查n1是否小于n2 |
n1 -le n2 | 检查n1是否小于等于n2 |
n1 -gt n2 | 检查n1是否大于n2 |
n1 -ge n2 | 检查n1是否大于等于n2 |
n1 -ne n2 | 检查n1是否不等于n2 |
shell中数值比较用上述,不用">"、"<"、"="等。
0x05 字符串比较
比较 | 描述 |
---|---|
str1 = str2 | 检查str1是否等于str2 |
str1 != str2 | 检查str1是否不等于str2 |
str1 < str2 | 检查str1是否小于str2 |
str1 > str2 | 检查str1是否大于str2 |
-n str | 检查str长度是否不为0 |
-z str | 检查str长度是否为0 |
注意一
当使用 ">" 或 "<"时需要使用转义符号,否则会被识别成重定向符号
## 错误
if [ "a" > "a"]
then
echo "True"
else
echo "False"
fi
## 正确
if [ "a" > "a"]
then
echo "True"
else
echo "False"
fi
注意二
-n或-z后面指定的字符串(变量)要带双引号(不可以单引号)
str=""
## 错误
if [ -n $str ]
then
echo "True"
else
echo "False"
fi
## 正确
if [ -n "$str" ]
then
echo "True"
else
echo "False"
fi
或者可以使用双方括号
str=""
## 错误
if [ -n $str ]
then
echo "True"
else
echo "False"
fi
## 正确
if [[ -n $str ]]
then
echo "True"
else
echo "False"
fi
注意三
字符串 大于 和 小于 的比较原理:
- 首先比较第一个字符,第一个字符大的不管后面的字符为大的一方
- 如果第一个字符相等,比较第二个字符,第二个字符大的不管后面的字符为大的一方;如果第二个字符相同,依次类推比较
- 字符之间的比较通过ascii数值进行比较
注意四
注意书写形式严格按照如下:
[ "abc" = "abc" ]
## 注意空格
否则可能会得到错误的结果
0x06 文件比较
比较 | 描述 |
---|---|
-d file | 检查file是否为目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并且是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-O file(大写) | 检查file是否存在并属当前用户所有 |
-G file(大写) | 检查file是否存在并默认组与当前用户相同 |
file1 -nt file2 | 检查file1是否比file2新 |
file1 -ot file2 | 检查file1是否比file2旧 |
注意一
root用户为最高权限用户,对任何文件的权限都为rwx
所以当存在 -r、-w、-x比较的脚本所属用户为root时,对任何文件判断都为True
注意二
-O和-G比较中的当前用户为Linux系统终端当前登录的用户
0x07 符合条件测试
## and
[ condition1 ] && [ condition2 ]
## or
[ condition1 ] || [ condition2 ]
0x08 高级特性
双括号
if (( expression ))
then
commands
fi
## 双括号主要是针对数学表达式
## 使用 > < = 等进行比较,不可以在使用 -gt等
## 可以使用逻辑、位运算符和自增、自减等
案例:
## 错误
if (( 10 -lt 10*10 ))
then
echo "True"
else
echo "False"
fi
## 正确
if (( 10 < 10*10 ))
then
echo "True"
else
echo "False"
fi
双方括号
if [[ expression ]]
then
commands
fi
## 双方括号主要是针对字符串比较
## 支持模式匹配
## 不是所有的shell都支持双方括号
案例:
if [[ abc = a* ]]
then
echo "True"
else
echo "False"
fi