momo zone

调核人的blog

bash 下的判断语句

运算符 描述 示例

文件比较运算符
-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

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: