friendlessstar 发表于 2018-8-24 12:06:48

转:shell中的if语句

  如果您曾用 C 编写过与文件相关的代码,则应该知道:要比较特定文件是否比另一个文件新需要大量工作。那是因为 C 没有任何内置语法来进行这种比较,必须使用两个 stat() 调用和两个 stat 结构来进行手工比较。相反,bash 内置了标准文件比较运算符,因此,确定“/tmp/myfile 是否可读”与查看“$myvar 是否大于 4”一样容易。
  下表列出最常用的 bash 比较运算符。同时还有如何正确使用每一选项的示例。示例要跟在 "if" 之后。例如:
  

  
if [ -z "$myvar" ]
  
then
  
echo "myvar is not defined"
  
fi
  

  

  

运算符
描述
示例
文件比较运算符            
-e             filename
如果             filename存在,则为真
[ -e /var/log/syslog ]
-d             filename
如果             filename为目录,则为真
[ -d /tmp/mydir ]
-f             filename
如果             filename为常规文件,则为真
[ -f /usr/bin/grep ]
-L             filename
如果             filename为符号链接,则为真
[ -L /usr/bin/grep ]
-r             filename
如果             filename可读,则为真
[ -r /var/log/syslog ]
-w             filename
如果             filename可写,则为真
[ -w /var/mytmp.txt ]
-x             filename
如果             filename可执行,则为真
[ -L /usr/bin/grep ]
filename1-nt             filename2
如果             filename1比             filename2新,则为真
[ /tmp/install/etc/services -nt /etc/services ]
filename1-ot             filename2
如果             filename1比             filename2旧,则为真
[ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符             (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z             string
如果             string长度为零,则为真
[ -z "$myvar" ]
-n             string
如果             string长度非零,则为真
[ -n "$myvar" ]
string1=             string2
如果             string1与             string2相同,则为真
[ "$myvar" = "one two three" ]
string1!=             string2
如果             string1与             string2不同,则为真
[ "$myvar" != "one two three" ]
算术比较运算符            
num1-eq             num2
等于
[ 3 -eq $mynum ]
num1-ne             num2
不等于
[ 3 -ne $mynum ]
num1-lt             num2
小于
[ 3 -lt $mynum ]
num1-le             num2
小于或等于
[ 3 -le $mynum ]
num1-gt             num2
大于
[ 3 -gt $mynum ]
num1-ge             num2
大于或等于
[ 3 -ge $mynum ]  有时,有几种不同方法来进行特定比较。例如,以下两个代码段的功能相同:
  

  
if [ "$myvar" -eq 3 ]
  
then
  
echo "myvar equals 3"
  
fi
  

  

  
if [ "$myvar" = "3" ]
  
then
  
echo "myvar equals 3"
  
fi
  

  

  

  上面两个比较执行相同的功能,但是第一个使用算术比较运算符,而第二个使用字符串比较运算符。
  回页首
  字符串比较说明
  大多数时候,虽然可以不使用括起字符串和字符串变量的双引号,但这并不是好主意。为什么呢?因为如果环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。这里有一个错误的比较示例:
  

  
if [ $myvar = "foo bar oni" ]
  
then
  
echo "yes"
  
fi
  

  

  

  在上例中,如果 myvar 等于 "foo",则代码将按预想工作,不进行打印。但是,如果 myvar 等于 "foo bar oni",则代码将因以下错误失败:
  

  
[: too many arguments
  

  

  

  在这种情况下,"$myvar"(等于 "foo bar oni")中的空格迷惑了 bash。bash 扩展 "$myvar" 之后,代码如下:
  

  
[ foo bar oni = "foo bar oni" ]
  

  

  

  因为环境变量没放在双引号中,所以 bash 认为方括号中的自变量过多。可以用双引号将字符串自变量括起来消除该问题。请记住,如果养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。"foo bar oni" 比较          应该写成:
  

  
if [ "$myvar" = "foo bar oni" ]
  
then
  
echo "yes"
  
fi
  

  

  


更多引用细节
  如果要扩展环境变量,则必须将它们用            双引号、而不是单引号括起。单引号          禁用 变量(和历史)扩展。


页: [1]
查看完整版本: 转:shell中的if语句