判断式
- 逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是 false,则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真,则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 or EXPR2 为真,则返回为真。
[ ] || [ ] 用 OR 来合并两个条件
[ ] && [ ] 用 AND 来合并两个条件
- if 判断式
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
else
执行第三段內容程式
fi
双圆括号(( ))
:表示数学表达式
- 在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,而且在双圆括号里面的
>
、<
号不需要转意。 - 比如:
[ "$a" -lt "$b" ]
,也可以改成双括号的形式(("$a" < "$b"))
。
双方括号[[ ]]
:表示高级字符串处理函数
- 在判断命令中允许使用标准的字符串比较,还可以使用匹配模式,从而定义与字符串相匹配的正则表达式。
- 在 shell 中,
[ $a != 1 || $b = 2 ]
是不允许的,要用[[ $a != 1 || $b = 2 ]]
或者[ $a != 1 ] || [ $b = 2 ]
。
- 实例
if (( $a < $b )); then
# 算术操作:小于
elif [ $a -lt $b ]; then
# 与上边相同
elif [[ "$str"x != "test"x || "$str"x = "str2"x ]]; then
# 高级字符串处理
elif [ "$str"x != "test"x ] || [ "$str"x = "str2"x ]; then
# 与上边相同
else
# 不满足条件
fi
数值判断
-eq 等于
-gt 大于
-lt 小于
-ne 不等于
-ge 大于等于
-le 小于等于
字符串的判断
- 说明
[ -z "$STR" ] 如果 STR 的长度为零,则返回为真,即空是真
[ -n "$STR" ] 如果 STR 的长度非零,则返回为真,即非空是真
[ "$STR1" == "$STR2" ] 如果两个字符串相同,则返回为真
[ "$STR1" != "$STR2" ] 如果字符串不相同,则返回为真
[ "$STR1" < "$STR2" ] 如果 STR1 字典排序在 STR2 前面,则返回为真
[ "$STR1" > "$STR2" ] 如果 STR1 字典排序在 STR2 后面,则返回为真
- 比较两个字符串是否相等
if [[ "$test"x = "test"x ]];then
echo yes
fi
- 注意要点一:使用单个等号;
- 注意要点二:等号两边各有一个空格,这是
unix shell
的要求; - 注意要点三:
"$test"x
最后的x
,这是特意安排的。
- 因为当
$test
为空时,上面的表达式就变成了x = testx
,显然是不相等的。 - 而如果没有这个
x
,表达式就会报错:[: =: unary operator expected
。
- 字符串(
str1)
# 方法一
if [[ $str =~ $str1 ]];then
echo yes
fi
# 方法二
if [ `echo $str | grep -e '$str1'` ];then
echo yes
fi
- 字符串($str)是否以
dx
开头
if [[ $str =~ ^dx ]];then
echo yes
fi
文件(文件夹)的判断
- 文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-b 判断对象是否存在,并且为 "块-特殊" 文件
-c 判断对象是否存在,并且为 "字-特殊" 文件
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-L 判断对象是否存在,并且为符号链接
-S 判断对象是否存在,并且为 socket
-nt 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ]
- 实例
- 文件夹不存在则创建
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi
- 判断文件夹是否存在
if [ -d "/data/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi
- 文件存在则删除
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi
- 判断文件是否存在
if [ -f "/data/filename" ];then
echo "文件存在"
else
echo "文件不存在"
fi