Linux shell 条件判断

Posted by chunyang on March 18, 2017
TAGS: #shell

Linux shell 编程的条件判断主要使用

if [ condition ]; then
# your statements
fi
  • 注意 condition 左右是要有空格的,不然会得到如下的错误。有时候会被错误信息弄的莫名其妙。
[ $a -eq 1] # miss tailing zero
[: missing `]''`]

[$a -eq 1 ] # miss leading zero
[: -eq: unary operator expected]
  • 注意如果使用变量,使用”“将变量包裹起来,放置被shell扩充后造成混淆。
a="11 11"
if [ -z $a  ] # not wrap using ""
then
    echo 'hh'
fi
[: 11: binary operator expected]

上述的错误是因为 $a 被展开成实际的 11 11,但是没有用双引号扩起来实际上条件是:

-z 11 11

shell 本身支持很多的内置条件,主要分为三类:

  • 文件相关的:文件是否存在,文件属性等
  • 字符串相关的
  • 数字相关的

文件相关的

  • [ -b file ] file是块设备文件
  • [ -c file ] file是字符设备文件
  • [ -f file ] file为一般文件
  • [ -g file ] file有设置它的setgid位
  • [ -h file ] file是一符号连接
  • [ -L file ] file是一符号连接,等同于-h
  • [ -p file ] file是管道文件
  • [ -S file ] file是Socket文件
  • [ -s file ] file是空文件
  • [ -d file ] file是目录
  • [ -e file ] file存在
  • [ -r file ] file可读
  • [ -w file ] file可写
  • [ -x file ] file可执行

字符串相关的

  • -z string: 判断字符串是否为空
  • -n string: 判断字符串是否非空
  • s1 = s2 : 相等
  • s1 == s2 : 相等
  • s1 != s2 : 不相等

字符串的其它比较一般放在[[ ]] 中。

  • [[ “$a” > “$b” ]]
  • [[ “$a” == z* ]] : 正则匹配的比较
  • [[ “$a” == “z*” ]]: 字面的比较

数字相关的

  • n1 -eq n2
  • n1 -lt n2
  • n1 -le n2
  • n1 -gt n2
  • n1 -ge n2
  • n1 -ne n2

表达式的组合

  • -a: 与
  • -o: 或
  • ! : 非

上述实例如下:

if [ n1 -eq n2 -a n3 -gt n4 ]
then
    echo "do something"
fi
if [ n1 -eq n2 -o n3 -gt n4 ]
then
    echo "do something"
fi

if [ ! -e file ]
then
    echo "File not exist"
fi

Linux 命令作为条件

Linux 下很多的命令执行成功返回0,执行失败返回非0。如果需要根据命令的执行情况来决定下一步要进行 的操作。

# test.txt中有两行文本:
# hi
# hello

grep "hi" test.txt

if [ $? -eq 0 ]
then
    echo "Success."
fi

$? 表示上次命令的返回值。实际上可以直接直接使用如下形式:

if grep "hi" test.txt &>/dev/null
then
    echo "Success."
else
    echo "Failed"
fi

结合 &&, ||, (cmd1, cmd2)

当某个条件为真时,需要执行某些操作。使用 if 当然可以完成所有工作,但是除了写条件,还要写 iffithen,比较多。利用 Linux 短路的操作,可以方便完成上述功能。

[ -e file ] && echo "File found"
[ ! -e file ] && echo "File not found"

其它

  • [ condition ] 可以替换为 test conditiontestshell 关键字

本文完


Creative Commons License
This work is licensed under a CC A-S 4.0 International License.