1、条件测试: test [

命令test[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)

左方括号[确实是一个命令的名字,传给命令的各参数之间应该用空格隔开

\测试命令


[ -d DIR ]

如果DIR存在并且是一个目录则为真

[ -f FILE ]

如果FILE存在且是一个普通文件则为真

[ -z STRING ]

如果STRING的长度为零则为真

[ -n STRING ]

如果STRING的长度非零则为真

[ STRING1 = STRING2 ]

如果两个字符串相同则为真

[ STRING1 != STRING2 ]

如果字符串不相同则为真

[ ARG1 OP ARG2 ]

ARG1ARG2应该是整数或者取值为整数的变量,OP-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个


带与、或、非的测试命令


[ ! EXPR ]

EXPR可以是上表中的任意一种测试条件,!表示逻辑反

[ EXPR1 -a EXPR2 ]

EXPR1EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与

[ EXPR1 -o EXPR2 ]

EXPR1EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或


例如:


$ VAR=abc $ [ -d Desktop -a $VAR = 'abc' ] $ echo $? 0


$VAR必须变量事先定义,否则Shell展开为空字符串,会造成测试条件的语法错误(展开为

[ -d Desktop -a = 'abc' ]),


$ unset VAR $ [ -d Desktop -a $VAR = 'abc' ] bash: [: too many arguments $ [ -d Desktop -a "$VAR" = 'abc' ] $ echo $? 1


2、if/then/elif/else/fi

和C语言类似,在Shell中用ifthenelifelsefi这几条命令实现分支控制。

这种流程控制语句本质上也是由若干条Shell命令组成的,如


if [ -f ~/.bashrc ]; then . ~/.bashrc fi


其实是三条命令,if [ -f ~/.bashrc ]是第一条,then . ~/.bashrc是第二条,fi是第三条。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,then后面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then后面当作一条命令处理。和[命令一样,要注意命令和各参数之间必须用空格隔开。if命令的参数组成一条子命令,如果该子命令的Exit Status为0(表示真),则执行then后面的子命令,如果Exit Status非0(表示假),则执行elifelse或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其它命令。Shell脚本没有{}括号,所以用fi表示if语句块的结束。见下例:


#! /bin/sh if [ -f /bin/bash ] then echo "/bin/bash is a file" else echo "/bin/bash is NOT a file" fi if :; then echo "always true"; fi



:是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真


#! /bin/sh

echo "Is it morning? Please answer yes or no."
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
  echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
  echo "Good afternoon!"
else
  echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
  exit 1
fi
exit 0



read命令的作用是等待用户输入一行字符串,将该字符串存到一个Shell变量中

此外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性,很多Shell脚本喜欢写成这样:


test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)


&&相当于“if...then...”,而||相当于“if not...then...”。&&和||用于连接两个命令,而上面讲的-a-o仅用于在测试表达式中连接两个测试条件,要注意它们的区别,例如,


test "$VAR" -gt 1 -a "$VAR" -lt 3


和以下写法是等价的


test "$VAR" -gt 1 && test "$VAR" -lt 3