1、算术运算比较运算符(bash自身不能比较浮点数)

-eq 等于          [ $num1 -eq $num2 ] 
-ne 不等于       [ 100   -ne $num1 ] 
-lt 小于           [ 100   -lt `expr $num1 + $num2` ] 
-le 小于或等于   [ 100   -le `expr $num1 \* $num2` ] 
-gt 大于           [ 100   -gt `expr $num1 / $num2` ] 
-ge 大于或等于   [ 100   -ge `expr $num1 % $num2` ]

2、字符串比较运算符

-z string  如果 string 长度为零,则为真  [ -z "`ps aux | grep mysql`" ] 
-n string  如果 string 长度非零,则为真  [ -n "$string" ]
              【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2  如果 string1 与 string2 不同,则为真  [ "$str1" != "Snail" ] 
string1 == string2  如果 string1 与 string2 相同,则为真  [ "$str1" == "$str2" ]
                    (上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1 < string2   如果 string1 按字典顺序比较小于 string2,则为真
string1 > string2   如果 string1 按字典顺序比较大于 string2,则为真

3、文件比较运算符

-a filename  如果 filename 存在,则为真                   [ -e $HOME/.bashrc ]
-e filename  (同上)
-b filename  如果 filename 存在,并且是块文件,则为真     [ -e /dev/loop0 ]
-c filename  如果 filename 存在,并且是字符文件,则为真   [ -e /dev/ttyS0 ]
-d filename  如果 filename 存在,并且为目录,则为真       [ -d /home/snail ] 
-f filename  如果 filename 存在,并且为常规文件,则为真   [ -f /dev/ttyS0 ]
-g filename  如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename  如果 filename 存在,并且为符号连接,则为真   [ -h /bin/vi ]
-L filename  (同上)
-k filename  如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename  如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename  如果 filename 存在,并且可读,则为真         [ -r /etc/passwd ]
-s filename  如果 filename 存在,并且大小不为零,为真     [ -s ./none-zero ]
-u filename  如果 filename 存在,并且为set-user-id,为真  [ -f $HOME/ak47 ]       
-w filename  如果 filename 存在,并且可写,则为真         [ -w /var/log/mail ] 
-x filename  如果 filename 存在,并且可执行,则为真       [ -x ./start.sh ]

下面这些不常用的:

-t fd        如果文件描述符被打开并指向一个终端,则为真   [ -t /proc/1/fd/10 ]
              【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename  如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename  如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename  如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename  如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname   如果 shell 选项 optname 被开启,则为真
              【提示】使用 set -o 来查看
file1 -nt file2  如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2  如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2  如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真
              【提示】查看文件的索引节点可以用 ls -i 选项

以下是shell中判断字符串包含的方法:
方法一:利用grep查找
先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果

strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
  echo "包含"
else
  echo "不包含"
fi

如果结果不为空,说明strA包含strB。如果结果为空,说明不包含。
这个方法充分利用了grep 的特性,最为简洁。

方法二:利用字符串运算符

strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
then
  echo "包含"
else
  echo "不包含"
fi

利用字符串运算符 =~ 直接判断strA是否包含strB。(这不是比第一个方法还要简洁吗!)

方法三:利用通配符

A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
  echo "包含"
else
  echo "不包含"
fi

这个也很easy,用通配符*号代理strA中非strB的部分,如果结果相等说明包含,反之不包含。

方法四:利用case in 语句

thisString="1 2 3 4 5" # 源字符串
searchString="1 2" # 搜索字符串
case $thisString in 
  *"$searchString"*) echo Enemy Spot ;;
  *) echo nope ;;
esa

这个就比较复杂不推荐;

带符号 * 的表示必填项