基本格式
shell中条件测试语句的基本语法如下
if [ $a==$b ]; then
# do something
elif [ $a -gt $b ]; then
# do something
else
# do something
fi
敲黑板:条件测试必须放在方括号内,并且表达式与方括号之间需要有空格
条件测试参与布尔运算:
if [ condition1 ] && [ condition2 ]
: 逻辑与,同时满足condition1和condition2if [ condition1 ] || [ condition2 ];
: 逻辑或,满足condition1或condition2
数字比较(仅限整数)
由于>
和<
在shell中还有重定向的功能,因此比较数字时大于号和小于号需要转义。各种比较方式如下:
- 判断两个整数是否相等:
if [ $a == $b ]
或if [ $a -eq $b ]
; - 判断两个整数是否不等:
if [ $a != $b ]
或if [ $a -ne $b ]
; - 判断是否大于:
if [ $a -gt $b ]
或if [ $a \> $b ]
; - 判断是否小于:
if [ $a -lt $b ]
或if [ $a \< $b ]
; - 判断是否大于或等于:
if [ $a -ge $b ]
; - 判断是否小于或等于:
if [ $a -le $b ]
;
字符串
基本比较
字符串比较使用的是字典顺序,而-eq
和-lt
等比较只能用于整数比较,因此字符串的比较只能使用转义后的大于号和小于号:
- 比较两字符串是否相等:
if [ $str1 == $str2 ]
- 比较两字符串是否不等:
if [ $str1 != $str2 ]
- 比较是否大于:
if [ $str1 \> $str2 ]
- 比较是否小于:
if [ $str1 \< $str2 ]
- 判断字符串长度是否不为0:
if [ -n $str1]
- 判断字符串长度是否为0:
if [ -z $str1]
长度比较
可以使用${#str}
来获取字符串的长度,故可以判断长度是否满足各种不同的要求,如:
- 判断字符串长度是否等于5:
if [ ${#str} -eq 5 ]
- 判断字符串长度是否大于10:
if [ ${#str} -gt 10 ]
- 判断字符串长度是否小于等于99:
if [ ${#str} -le 99 ]
模式匹配
可以使用if [[ $str =~ pattern ]]
的形式来判断字符串是否匹配某种模式。如:
- 判断字符串是否是整数:
if [[ $str =~ ^[0-9]+$ ]]
- 判断字符串是否以
-
开头,常用于参数解析:if [[ $str =~ ^- ]]
- 判断字符串是否在某个数组中:
if [[ "${arr[@]}" =~ $str ]]
文件比较
常常在shell脚本中判断各种文件或目录是否满足要求,常用语法如下:
- 判断某路径是否存在,路径可能是文件也可能是目录:
if [ -e $path ]
- 判断路径是否存在,并且是目录:
if [ -d $dirPath ]
- 判断路径是否存在,并且是文件:
if [ -f $filePath ]
- 判断路径是否存在,并且是文件,同时内容非空:
if [ -s $filePath ]
- 判断路径是否存在,并且是文件,同时可读:
if [ -r $filePath ]
- 判断路径是否存在,并且是文件,同时可写:
if [ -w $filePath ]
- 判断路径是否存在,并且是文件,同时可运行:
if [ -x $filePath ]
- 判断路径是否存在,并且是文件,同时归属当前用户:
if [ -o $filePath ]
- 判断路径是否存在,并且是文件,同时其默认组与当前用户所在组一致:
if [ -G $filePath ]
- 判断path1是否比path2新:
if [ $path1 -nt $path2 ]
- 判断path1是否比path2旧:
if [ $path1 -ot $path2 ]