Linux Shell下条件语句

来源:互联网 发布:淘宝图片尺寸大小 编辑:程序博客网 时间:2024/06/05 20:12
  1. Linux  Shell下条件语句:  
  2.   
  3. 1、  测试字符串之间的关系  
  4.         bash把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。同样任何数字也可以作为字符串进行操作。   
  5.   用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下:    
  6.     str1 = str2      当两个串有相同内容、长度时为真   
  7.     str1 != str2       当串str1和str2不等时为真    
  8.     -n str1         当串的长度大于0时为真(串非空)    
  9.     -z str1         当串的长度为0时为真(空串)    
  10.     str1           当串str1为非空时为真    
  11.      不但Shell程序可以使用test进行条件判断,test命令也可以独立执行,如:    
  12.     $str1=abcd    
  13.     $test $str1 = abcd    
  14.     $echo $?    
  15.     结果显示:0    
  16. 与上例中第一行赋值语句中的等号不同,test命令中的等号两边必须要有空格。本例:test命令共有3个参数。注意两个串相等必须是长度和内容都相等。   
  17.     $str1="abcd "    
  18.     $test "$str1" = abcd    
  19.     $echo $?    
  20.     结果显示:1   
  21.       上面str1包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等,test返回1。    
  22.       不带任何操作符和使用-n操作符测试一个串结果是一样的,例如:    
  23.     $str1=abce    
  24.     $test $str1    
  25.     $echo $?    
  26.     结果显示:0       
  27.     $test -n $str1    
  28.     $echo $?    
  29.     结果显示:0   
  30.       但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例:    
  31.     $str1="   "    
  32.     $test $str1    
  33.     $echo $?    
  34.     结果显示:1    
  35.     $test -n "$str1"    
  36.     $echo $?    
  37.     结果显示:0    
  38.     $test -n $str1    
  39.     结果显示:  
  40. test:argument expected    
  41.   上例中,第一次测试为假因为Shell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故 test命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中, shell把空格删除,只把-n传个test命令,所以显示参数错。  
  42.    
  43. 2、  测试两个整数之间关系    
  44. test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下:    
  45.     int1 -eq int2    两数相等为真    
  46.     int1 -ne int2    两数不等为真   
  47.     int1 -gt int2    int1大于int2为真   
  48.     int1 -ge int2    int1大于等于int2为真    
  49.     int1 -lt int2    int1小于int2为真    
  50.     int1 -le int2    int1小于等于int2为真    
  51.   下面的例子反映了字符串比较与数字比较的不同:    
  52.     $str1=1234    
  53.     $str2=01234    
  54.     $test $str1 = $str2    
  55.     $echo $?    
  56.     结果显示:1  //0为真,1为假;  
  57.     $test $str1 -eq $str2    
  58.     $echo $?    
  59.     结果显示:0   //0为真,1为假;  
  60.   
  61. 3、  有关文件的测试    
  62. 使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。    
  63.   -r file     用户可读为真    
  64.   -w file     用户可写为真    
  65.   -x file     用户可执行为真    
  66.   -f file     文件为正规文件为真    
  67.   -d file     文件为目录为真    
  68.   -c file     文件为字符特殊文件为真    
  69.   -b file     文件为块特殊文件为真    
  70.   -s file     文件大小非0时为真    
  71.   -t file     当文件描述符(默认为1)指定的设备为终端时为真  
  72.   
  73. 4、  复杂的条件测试(and 、or 、not)   
  74.     -a           与    
  75.   -o          或    
  76.    !          非   
  77.   就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如:   
  78.     $test -r em.null -a -s em.null   
  79.     $echo $?   
  80.     结果显示:1   
  81.     说明了em.null并不是可读并且非空的文件   
  82.   
  83. 5、  另一种执行test的方法    
  84.     bash中还有另一种执行test命令的方法,就是把测试条件放到一对[ ]中,例如:    
  85.     $int1=4    
  86.     $[ $int1 -gt 2 ]    
  87.     $echo $?   
  88.     结果显示:0    
  89. 要注意在[ 的后面和 ]符号的前面要有一个空格。    
  90.   下面我们用test命令写个简单但比较完善的程序:    
  91.     #-- 备份程序   
  92.     #-- 检查参数    
  93.     if [ $# -ne 1 ]    
  94.     then    
  95.       echo "请在程序名后面指出要备份文件所在目录!"    
  96.       exit 1    
  97.     fi    
  98.     #-- 检查目录名是否有效    
  99.     if [ !-d "$1" ]    
  100.     then    
  101.       echo "$1 不是一个目录!"   
  102.       exit 2    
  103.     fi   
  104.     cd $1    
  105.     ls -a | cpio -o >/dev/mnt0    
  106.     if [ $? -eq 0 ]    
  107.     then    
  108.       rm *    
  109.     else    
  110.       echo "cpio执行不成功!备份失败..."    
  111.       exit 3    
  112.     fi  
  113.    
  114. 6、  空命令  
  115.         在Bsh中用 : 代表空命令,就是充个数,什么都不做。  
  116.           
  117. 7、  嵌套if语句和else if 结构  
  118.         检查条件1    
  119. A:当条件1为真,则执行一部分操作    
  120.   B:若条件1为假,检查条件2    
  121.     1)若条件2为真,执行另外一部分操作    
  122.     2)若条件2为假,检查条件3    
  123.     3)若条件3为真,执行其他一部分操作    
  124.   语法如下:    
  125.     if command    
  126.     then    
  127.       command    
  128.     else    
  129.       if command    
  130.       then    
  131.         command    
  132.       else   
  133.         if command    
  134.         then    
  135.           command    
  136.         fi    
  137.       fi    
  138.     fi  
  139.    
  140. 8、  elif语句    
  141.   嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为:    
  142.     if command    
  143.     then    
  144.       command    
  145.     elif command    
  146.     then    
  147.       command    
  148.     elif command   
  149.     then    
  150.       command    
  151.     fi   
  152. 上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。  
  153.    
  154. 9、  case语句    
  155. 前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。     
  156. case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。    
  157.   case value in    
  158.    pattem 1)    
  159.     command    
  160.     command;;    
  161.    pattem 2)    
  162.     command    
  163.     command;;    
  164.    ....    
  165.    pattem)    
  166.     command;    
  167.   esac    
  168.   case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。";;"表示该模式对应的命令部分程序。    
  169.   通过学习下面的read语句,我们们再举例子说明case语句的用法。  
  170.   
  171. 10、 read语句    
  172.  Shell程序不但可以通过命令行参数得到输入数据,还可以使用read命令提示用户输入数据,其语法格式为:    
  173.   read var1 var2... ...varn    
  174. 当Bash 遇到一个read语句时,在标准输入文件中读取数据直到一个换行符。此时Shell在解释输入行时,不进行文件名或变量的替换,只是简单地删除多余的空格。然后Shell将输入行的第一个字的内容给变量1,第二个给变量2,直到所有变量都赋上值或是输入行为空。若输入行中字的个数超过变量个数, Shell将把输入行中剩余的所有字的内容都赋给最后一个变量。当变量个数多于输入行字的个数时候,多于的变量将赋一个空值。输入行的每一个字是由空格分隔的一个字母和数字组成的字符串。  
  175.  $read var1 var2 var3    
  176.     输入:Hello my friend   
  177.   $echo $var1 $var2 $var3    
  178.     结果显示:Hello my friend    
  179.   $echo $var2    
  180.     结果显示:my   
  181.   
  182. 下面用个read和case的例子结束本部分的学习:    
  183.   #--交互式备份,恢复程序    
  184.   echo "输入要备份文件所在目录:\c"    
  185.   read WORKDIR    
  186.   if [ !-d $WORKDIR ]    
  187.   then    
  188.     echo "Sorry,$WORKDIR is not a directory"    
  189.     exit 1    
  190.   fi    
  191.   cd $WORKDIR    
  192.   echo "输入选择:"    
  193.   echo _    
  194.   echo "1.恢复到 $WORKDIR"    
  195.   echo "2.备份 $WORKDIR"    
  196.   echo "0.退出"    
  197.   echo    
  198.   echo "\c"    
  199.   read CHOICE    
  200.   case "$CHOICE" in    
  201. echo "恢复中... ..."    
  202.     cpio -i < /dev/mnt0;;    
  203. echo "备份中... ..."    
  204.     ls | cpio -o > /dev/mnt0;;     
  205.    0)exit 1    
  206.    *)exit 1    
  207. esac    
  208.   if [ $? -ne 0 ]    
  209.   then    
  210.    echo "程序运行中出现错误!"    
  211.   else    
  212.    echo "操作成功!"    
  213. fi      
  214.   在上面代码中,"*"定义了其他模式下不匹配时的默认操作。    
  215. 循环语句    
  216.   前面介绍的程序和所学的语句都是从头到尾成一条主线下来,或是成分支结构,在日常管理UNIX的过程中,经常要重复的做一些操作,处理批量的问题,这就涉及到了循环结构,同高级语言相似,UNIX的Shell也提供了强大的循环处理语句。    
  217.   Bsh语言中有三种循环语句-while循环、until循环、for循环,下面通过具体的例子分别介绍这三种结构。    
  218. While循环    
  219.   在while循环语句中,当某一条件为真时,执行指定的命令。语句的结构如下:    
  220. while command    
  221. do    
  222.   command   
  223.   command    
  224.   … …    
  225. done    
  226. 示例代码如下:  
  227.    
  228. #测试while循环小程序    
  229. x_t=1    
  230.   while [  $x_t -lt 5 ]    
  231.   do    
  232.      mm=` expr $x_t \* $int `  #注意"\"的作用  
  233.      echo "$mm"    
  234.      x_t=` expr $x_t + 1 `   #注意expr的用法    
  235.   done    
  236.   echo "THE WHILE IS END!\n"    
  237. 程序的执行结果如下:    
  238. 1    
  239. 4    
  240. 9    
  241. 16    
  242. THE WHILE IS END   
  243.    
  244.   在上述程序中,当变量x_t的值小于5的时候,执行while循环中的语句。在第五次循环时, [ $x_t-lt5]命令返回非零值,于是程序执行done后面的代码。    
  245. 现在利用while循环,可以改进我们早些时候用的备份数据的例子,当用户指定的目录备份完毕后,使用while循环使程序执行一次可以备份多个用户指定的目录。代码如下:    
  246. echo "欢迎使用备份小程序"    
  247.   ANS=Y    
  248.   while [ $ANS = Y -o $ANS = y ]    
  249.   do    
  250.     echo _    
  251.     #读目录名    
  252.     echo "输入要备份的目录名:\c"    
  253.     read DIR    
  254.     if [ ! -d $DIR ]    
  255.     then    
  256.         echo "$DIR不是一个目录!"    
  257.         exit 1    
  258.     fi    
  259.     cd $DIR    
  260.     echo "请选择:"    
  261.     echo _    
  262.     echo "1 恢复数据到 $DIR"    
  263.     echo "2 备份$DIR的数据"    
  264.     echo    
  265.     echo "请选择:\c"   
  266.     read CHOICE    
  267.     case "$CHOICE" in    
  268.        1) echo "恢复中… …"    
  269.         cpio -i        2) echo "备份中… …"    
  270.         cpio -o >/dev/rmt0;;    
  271.        *) echo "选择无效"    
  272.     esac    
  273.     if [ $? -ne 0 ]    
  274.     then    
  275.        echo "cpio执行过程中出现问题"    
  276.        exit 2    
  277.     fi    
  278.     echo "继续别的目录吗?(Y/y)\c"    
  279.     read ANS    
  280.   done    
原创粉丝点击