条件执行
shell脚本能够测试任何命令的返回值, 不管它是直接从命令行中被调用的还是在脚本中被调用的(所以你最好在脚本的末尾加上exit语句).
一般地, bash中使用"test"和"["来判断命令的返回值. 如果是要检验命令的返回值, 检测返回值的方法和c中类似.
$ if ! grep $USER /etc/passwd
$ grep $USER /etc/passwd; if [ $? -ne 0 ];
test和[是等价的, 唯一的区别是调用[时候会在命令末尾加一个]以增加可读性.
实际上man中关于test和[显示的是同样的内容.
它们的使用方法如下:
$
if test -f file>
then>
ls -l file>
fi若使用[, 第一句改为: $
if [ -f file ]注意: [与file之间要留有空格, 想象[和test等价就知道原因了.
test, [ 测试它之后的语句, 若为真, 则执行then到fi之间的语句. 测试的类容分为3类: 字符串比较, 算术比较, 文件类型. 具体可参考 $
man [
被比较的变量要用""引用起来! 看看下面的脚本: #!/bin/bash echo "please input 'yes' or 'no'" read answer if [ $answer = "yes" ]; then echo "yes" else echo "no" fi 如果我直接输入回车, 那么" if [ $answer = "yes" ]; then "语句会等价于 " if [ = "yes" ]; then ". 这是个无效的比较. 所以应该用""把$answer引用起来, 这样, 即便输入回车, 也是这样的比较: " if [ "" = "yes" ]; then " |
联想C语言里的条件执行: if (condition) , 对比bash中的if [condition], 可以把[]想象成C语言if之后的().
控制结构
if-elif-elseif condition
then
statements
elif
statements
else
statements
fi
要执行的语句跟在then之后, if语句以fi结尾.
|
forfor name [in list]
do
statements
done
如果不注明[ in list], 则默认为&@
要执行的语句跟在do之后, for语句以done结尾.
|
Since all shell values are considered strings by default, the for loop is good for looping through a series of strings, but is a little awkward to use for executing commands a fixed number of times.
while