运算符 | 描述 | 示例 |
文件比较运算符 | ||
-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 ] |
#!/usr/bin/env bash
for myfile in /etc/r*
do
if [ -d "$myfile" ]
then
echo "$myfile (dir)"
else
echo "$myfile"
fi
done
通常使用 "While" 语句来循环一定次数,比如,下例将循环 10 次
myvar=0 while [ $myvar -ne 10 ] do echo $myvar myvar=$(( $myvar + 1 )) done "Until" 语句提供了与 "while" 语句相反的功能:只要特定条件为 假 ,它们就重复。下面是一个与前面的 "while" 循环具有同等功能的 "until" 循环:
myvar=0 until [ $myvar -eq 10 ] do echo $myvar myvar=$(( $myvar + 1 )) doneCase 语句是另一种便利的条件结构。这里有一个示例片段:
#!/usr/bin/env bash myvar="hello" myfunc() { local x local myvar="one two three" for x in $myvar do echo $x done } myfunc echo $myvar $x
case "${x##*.}" in gz) gzunpack ${SROOT}/${x} ;; bz2) bz2unpack ${SROOT}/${x} ;; *) echo "Archive format not recognized." exit ;; esac 在上例中,bash 首先扩展 "${x##*.}"。在代码中,"$x" 是文件的名称,"${x##.*}" 除去文件中最后句点后文本之外的所有文本。 然后,bash 将产生的字符串与 ")" 左边列出的值做比较。在本例中,"${x##.*}" 先与 "gz" 比较,然后是 "bz2",最后是 "*"。 如果 "${x##.*}" 与这些字符串或模式中的任何一个匹配,则执行紧接 ")" 之后的行,直到 ";;" 为止,然后 bash 继续执行结束符 "esac" 之后的行。 如果不匹配任何模式或字符串,则不执行任何代码行,在这个特殊的代码片段中,至少要执行一个代码块,因为任何不与 "gz" 或 "bz2" 匹配的字符串都将与 "*" 模式匹配。 Local
#!/usr/bin/env bash myvar="hello" myfunc() { local x local myvar="one two three" for x in $myvar do echo $x done } myfunc echo $myvar $x |