2.2 条件及控制结构
条件: test 或 [命令。 当使用[命令时,还需要使用]来结尾。
test命令的退出码(表明条件是否被满足)决定是否需要执行后面的条件代码。
例如:
if test -f fred.c then echo "test success" fi if [ -f fred.c ] then echo "test success" fi if [ -f fred.c ]; then echo "test success" fi
注意:
1. [和被检查的条件之间必须留出空格 ;
2. then可和if放在一行,但必须在前面加分号
条件类型: test命令可以使用的条件类型可以归为3类:字符串比较、算术比较和与文件有关的条件测试
字符串比较 | 结果 |
string1 = string2 | 如果两个字符串相同,则结果为真 |
string1 != string2 | 如果两个字符串不同,则结果为真 |
-n string | 如果字符串不为空,则结果为真 |
-z string | 如果字符串为null(空串),则结果为真 |
算术比较 | |
expression1 -eq expression2 | 如果两个表达式相等,则结果为真 |
expression1 -ne expression2 | 如果两个表达式不等,则结果为真 |
expression1 -gt expression2 | 如果expression1>expression2,则结果为真 |
expression1 -ge expression2 | 如果expression1>=expression2,则结果为真 |
expression1 -lt expression2 | 如果expression1<expression2,则结果为真 |
expression1 -le expression2 | 如果expression1<=expression2,则结果为真 |
! expression | 如果表达式为假则结果为真,如果表达式为真则结果为假 |
文件条件测试 | |
-d file | 如果文件是一个目录则结果为真 |
-e file | 如果文件存在则结果为真(不可移植,常使用-f选项) |
-f file | 如果文件是一个普通文件则结果为真 |
-g file | 如果文件的set-group-id位被设置则结果为真 |
-r file | 如果文件可读,则结果为真 |
-s file | 如果文件的大小为0则结果为真 |
-u file | 如果文件的set-user-id位被设置则结果为真 |
-w file | 如果文件可写则结果为真 |
-x file | 如果文件可执行则结果为真 |
控制结构:
1. if 语句
if condition then statements else #或elif statements fi
#!/bin/sh echo "Is it morning? Please answer yes or no" read timeofday if [ "$timeofday" = "yes" ] #注意,如果用if [ $timeofday = "yes" ],可能变成 if [ = "yes" ] then echo "Good morning" elif [ "$timeofday" = "no" ] ; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized. Enter yes or no" exit 1 fi exit 0
2. for 语句
#/bin/sh # 固定字符串实例 for foo in bar fud 43 do echo $foo done # 使用通配符扩展的for循环 for file in $(ls f*.sh); do echo $file done exit 0
3. while和until语句
# 若condition为真,则执行statements,不满足条件就会终止 while condition do statemensts done # 若condition不为真,则执行statements,即条件不满足时执行statements until condition do statements done
3. case语句
case variable in pattern [ | pattern] ... ) statements;; pattern [ | pattern] ... ) statements;; ... esac
注意:
每个模式行都已双分号(;;)结尾;
要特别小心,case将使用第一个匹配的模式,即使后续的模式有更加精确的匹配也是如此。
#/bin/sh echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in yes) echo "Good Morning";; no ) echo "Good afternoon";; y ) echo "Good Morning";; n ) echo "Good afternoon";; * ) echo "Sorry, answer not recognized";; esac case "$timeofday" in yes | y | Yes | YES) echo "Good Morning";; n* | N* ) echo "Good afternoon";; * ) echo "Sorry, answer not recognized";; esac exit 0
4. 命令列表
statement1 && statement2 && statement3 && ... #从左到右顺序执行每条命令,直到有条命令返回false或列表中所有命令执行完毕。&&的作用是检查前一条命令的返回值。
statement1 || statement2 || statement3 || ... #从左到右顺序执行每条命令,直到有条命令返回true或列表中所有命令执行完毕。
5.
语句块
如果想在某些只允许使用单个语句的地方(比如&&或||列表中)使用多条语句,可以把它们括在{}内来构成一个语句块。