shell流控制:http://www.cnblogs.com/yunjiaofeifei/archive/2012/06/12/2546208.html
1、if then else 语句
if then else语句的基本格式如下:
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
fi
if语句以if开头,而以fi结束,在shell中的控制流结构的分支语句都是像这样开头跟结束的语句相反反过来,如下面的case语句,以case开头,以esac结束。elif即C语言的else if的意思。如果你只有一个条件,就没必要用到elif、else了。
一个例子:
#!/bin/sh
#iftest
if [ “10” -lt “12” ]
then
echo “yes,10 is less than 12”
fi
执行一下iftest
$./iftest
yes,10 is less than 12
其中,[]是测试命令,测试里面的内容是真还是假,如果真,则该测试命令返回的结果是真,如果为假则返回假。注意:[]与中间的内容一定要在两边各留一个空格,否则会出错。如[“10” -lt “12”]这样是错误的写法,一定要在两边各留一个空格才是测试命令。
因为在shell中,所有的命令执行后都有一个返回值,if是接收到该返回值作为它的条件。平时执行ls、cp、touch、mkdir等等这些命令时系统都会返回一个值表示执行该命令是否成功,该返回值就保存在$?这里了,如果你要看它的值就可以用:echo $?来查看了。如:
$ls
a.txt b.doc
$echo $?
0
在linux中一般用0表示执行成功,而非0则表示失败。如:
if ls
then
echo “Yes”
else
echo “no”
fi
该程序执行后的结果将会打印出Yes。这里ls执行成功后返回的值为0(成功),if接收到成功信号则其条件为真,所以就打印出Yes了。这里不要跟C的if混淆了,在C中0为假,非0为真,而这里倒反过来了,0为真,非0则为假了。这个就涉及到linux的习惯了,因为linux习惯用0来表示成功,非0表示失败。这里还要小心,不能像这样用:if (“10” -lt“12”)。上面的[“10” -lt “12” ]也是一个命令来的,相当于命令:test“10” -lt “12”。test是一个测试命令,如果要讲测试命令还有很多要讲,这里就直接讲控制流结构,至于测试命令有空再写了。
2、case 语句
case语句的格式如下:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
......
esac
上面的;;有点相当于C中case中的break语句的意味了,即执行完该模式后跳出case语句,不过有点不同的就是,shell中的case语句如果没有;;就会报错。
shell的case语句可以使用匹配模式,是元字符匹配模式,而不是正则表达式的匹配:
* 匹配所有的字符
? 匹配单个字符
[...]匹配[]括起的字符
所以在C中使用default模式的,这里可以使用*来代替如:
$cat casetest
#!/bin/sh
#casetest
echo "please input number 1 to 3"
read number
case $number in
1)
echo "you input 1"
;;
2)
echo "you input 2"
;;
3)
echo "you input 3"
;;
*)
echo "error! the number you input isn't 1 to 3"
;;
esac
执行这个shell脚本,如果你输入的是1~3外的数字,都将输出error! the number you input isn't 1 to 3这句。这里的*就是匹配所有模式。从前面开始执行,如果它不匹配于前面的任何一种模式,则会匹配到这里的*,结果就自然输出error! the number you input isn't 1 to 3这句了。case语句中的模式中还可以使用|(或),如:
$cat casetest
#!/bin/sh
#casetest
echo "please input number 1 to 10"
read number
case $number in
1|2|3)
echo "the number you input is 1~3"
;;
4|5|6)
echo "the number you input is 4~6"
;;
7|8|9|10)
echo "the number you input is 7~10"
;;
*)
echo "error! the number you input isn't 1 to 10"
;;
esac
这样无论你输出的是1,还是2,还是3都会输出第一句话,无论你输出的是4,还是5,还是6输出的都是第二句话,如此类推。最后来一个经典的例子:
$cat caseparam
#!/bin/sh
#caseparam
if [ $# != 1 ]
then
echo "Usage:`basename $0` [start|stop|help]" >&2
exit 1
fi
OPT=$1
case $OPT in
start)
echo "start..`basename $0`"
;;
stop)
echo "stop..`basename $0`"
;;
help)
echo "now don't support help"
;;
*)
echo "Usage:`basename $0` [start|stop|help]"
;;
esac
执行这个程序如果用./caseparam则输出:Usage:caseparam [start|stop|help] ;如果用./caseparam start 则输出:start..caseparam;如果用./caseparam stop则输出:stop..caseparam等等,以此类推。上面的$#是计算参数的个数,所以如果参数个数不等于1的话,该程序则退出。这个程序是不是感觉好熟悉呢?一般在/etc/init.d/下面的程序都是这种start、stop、restart...这种格式的。