Bash版本为4.1.5,可以man bash得到更多的信息,在里面找到对"CONDITIONAL EXPRESSIONS"的描述。
对于文件/字符串/数字分别有不同的条件表达式。(由于Bash也是将数字当成字符串处理的,所以数字的比较也可以用字符串的条件表达式。)
注意:
1. 字符串的比较用=, !=之类的,数字的比较用eq, gt之类的;
2. 字符串的“等于“比较,为了与POSIX一致,在[]中请用"=".(尽管"=="也可以可以用的);
3. 字符串的>, <比较运算符,一般放在[[ ]]之中,而不是test ("[]");
4. 字符串的>, <比较的结果,与本地的locale有关,是按照其字典序列进行比较的。
下面对Bash中的条件表达式做个知识点的记录,然后附上一个简单的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 ]
string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真 [[ $myvar < "one" ]]
string1 > string2 如果string1在本地的字典序列中排在string2之后,则为真 [[ $myvar > "one" ]]
算术比较运算符
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 ]
逻辑运算符
expr1 -a expr2 与 [ 1 -eq 1 -a 1 -ne 2 ]
expr1 -o expr2 或 [ 1 -ne 1 -o 1 -ne 2 ]
! expr1 非 [ ! -f myfile ]
一个测试脚本实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash num=22 var="Jay" file="/root/just-for-fun.txt" if [ ! -f $file ]; then echo "----new------" | tee $file echo "just for fun." | tee -a $file echo "$(date)" | tee -a $file else echo "---append----" | tee -a $file echo "$(date)" | tee -a $file fi if [ 22 -eq $num ]; then echo "num is equal to 22." else echo "num is NOT equal to 22." fi if [ "i""Jay" = "i""$var" ]; then echo "var is equal to 'Jay'." else echo "var is NOT equal to 'Jay'." fi if [[ "Jay" > "jay" ]]; then echo "'Jay' sorts after 'jay' lexicographically." else echo "'Jay' does NOT sort after 'jay' lexicographically." fi |