判断式
  • 逻辑判断
[ ! 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
  • 字符串(shell怎么判断grep结果是否为空 shell grep多个条件判断_运维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