shell学习笔记--if,caselinux
shell的控制流结构主要有if语句、for语句、case语句、while语句、until语句这五种,在shell中这些语句的用法有点相似C语言,很容易学会,但也很容易忘记,只有常常实用它们才不会很快忘记,像我以前看的时候很快就看完了,可是好久没用,过一阵子又把它忘记了,如今又重看了一遍才记起来,好了,下面将详细介绍这几种语句的用法:正则表达式
一、if then else 语句shell
if then else语句的基本格式以下:less
if 条件1ide
then 命令1学习
elif 条件2测试
then 命令2spa
else 命令3rest
fiorm
if语句以if开头,而以fi结束,在shell中的控制流结构的分支语句都是像这样开头跟结束的语句相反反过来,以下面的case语句,以case开头,以esac结束。elif即C语言的else if的意思。若是你只有一个条件,就不必用到elif、else了,这些都是你根据须要去使用的。固然了,若是你有不少个条件,你也能够使用多个elif,就像C语言同样。
举个例子:
$cat iftest
#!/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”]这样是错误的写法,必定要在两边各留一个空格才是测试命令。这里能够看出,if后面跟着的是一条命令,if这里明明要跟一个条件才对啊,为何会跟一条命令呢?这是由于在shell中,全部的命令执行后都有一个返回值,if是接收到该返回值做为它的条件,也就是真仍是假这两种条件,若是该命令执行成功,则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是一个测试命令,若是要讲测试命令还有不少要讲,这里就直接讲控制流结构,至于测试命令有空再写了。
二、case 语句
case语句的格式以下:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
......
esac
上面的;;有点至关于C中case中的break语句的意味了,即执行完该模式后跳出case语句,不过有点不一样的就是,shell中的case语句若是没有;;就会报错,可是C中的case语句少了break,语法上仍是正确的,只是在符合该模式后还会继续执行直到遇到break或直到结束为止。在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...这种格式的。
好了,控制流结构中的分支语句部分就这两种了,下篇继续讲控制流结构中的循环语句。