五、until循环
    until命令刚好与while命令相反。until命令需要指定一条测试命令,这条命令通常产生一个非零的状态值。只要测试命令的退出状态非零,bash shell就会执行列在循环体内的命令。一旦测试条件返回0退出状态,循环停止。所以until命令的格式为:
         until 条件;  do
              循环体
         done
   下面是一个使用until命令的例子:
         num=100
         until [ $num  -eq  0 ]; do
             echo $num
             num=$[ $num - 25 ]
         done
    执行结果为:
           Linux脚本编程中常用的知识点(二)_函数

 

     六、控制循环命令:break命令和continue命令     
    其实循环开始之后可以不继续循环,break和continue命令可以帮助我们控制循环内部发生的事情。但两者有不同的使用方法,下面介绍如何使用这两个命令来控制循环操作。
     1、break命令
     break命令是在处理过程中跳出循环的一种简单方法。可以使用break命令退出任何类型的循环,包括while循环和until循环。break的常用格式为break  n,n表明要跳出的循环级别。默认情况n=1,代表跳出当前循环。如果将n设置为2,break命令将停止外循环的下一级循环:
    下面举例说明:
     当n=1时
         for  ((  a = 1; a < 4; a++ )) ;  do
              echo "outer  loop:$a"
              for(( b = 1;b < 10;b++  )); do
                 if [ $b -eq 3 ]; then
                     break
                 fi
                 echo "    Inner loop:$b"
              done
         done
   脚本执行结果为:

   Linux脚本编程中常用的知识点(二)_函数_02
   内部的break控制了内部循环的次数,但外循环会继续按指定进行。
    当n=2时
           for  ((  a = 1; a < 4; a++ )) ;  do
              echo "outer  loop:$a"
              for(( b = 1;b < 10;b++  )); do
                 if [ $b -gt 3 ]; then
                     break 2
                 fi
                 echo "    Inner loop:$b"
               done
          done         
    脚本执行结果为:
           Linux脚本编程中常用的知识点(二)_函数_03

    此时,执行break命令是外循环停止。

     2、continue 命令
    它可以提前结束当前一次的循环,但却不跳出循环,而是执行下一次的循环。
       下面介绍一个简单的例子。
         for  (( i = 1; i < 10; i++ ))
         do
               if  [ $i -gt 3 ]  && [ $i  - lt 8] ; then
                 continue
               fi
               echo "Number:$i"
         done
      执行结果为:
          Linux脚本编程中常用的知识点(二)_函数_04

    当if语句的条件满足时,continue命令生效,跳过该循环中余下的命令,进入下一次的循环。
     在while循环和until循环中也可以使用continue命令。但谨记,当shell执行continue命令是,它跳过余下的命令。

   七、条件测试
   条件测试是一种检测if-then语句中不用条件的方法。它有几种基本格式:
                [ expression ]
                ` expression `
                test  expression
    bash的条件测试类型可分为三种:数值比较,字符串比较,文件比较。
   下面介绍在每种类型的使用方法。
   1、数值比较
   数值比较时常有双目操作浮:N1  操作符  N2。数值测试还能用于判断数值和变量。
   基本的双目操作符有:  
           N1 -eq N2:判断N1是否等于N2
           N1 -ne N2:判断N1是否不等于N2
           N1 -gt  N2:判断N1是否大于N2
           N1 -lt   N2:判断N1是否小于N2
           N1 -ge N2:判断N1是否大于等于N2
           N1 -le N2:判断N1是否小于等于N2
   下面介绍一个例子进行说明。
    使用命令取出用户的ID号,并保存至变量MYID中;如果 ID号等于0,说明这是管理员;如果ID号大于等于1并且小于等于499,说明这是系统用户;否则就说明这是普通用户。
                MYID=`id -u user1`
                if [ $MYID -eq 0 ]; then
                     echo "Admin."
                elif [ $MYID -ge 1 ] && [ $MYID -le 499 ]; then
                     echo "Sys user."
                else       
                    echo "Common user."
                fi

    2、字符串比较
    字符串测试的常用操作符有:
            str1 >  str2               判断str1是否大于str2
            str1 <  str2               判断str1是否小于str2
            str1 =  str2               判断str1是否等于str2
            str1 !=  str2              判断str1是否不等于str2
            -n str1                     判断str2是否不为空,不空为真,为真则假
            -z str2                     判断str2是否为空,为空则真,不空为假
        在比较两字符串大小时,大于和小于符号一定要转义,否则shell会将它们当做重定向符号,将字符串看做文件名。另外字符串比较是最好用""括起来。
        例子:比较字符串baseball和hockey的大小。
            var1=baseball
            var2=hockey
            if [  " $var1"  \>  "$var2"  ];  then
               echo "$var1 is  greater than $var2."
            else
               echo "$var1 is  less than $var2."
            fi
         脚本执行结果:
           Linux脚本编程中常用的知识点(二)_until_05

 

               3、文件比较
    文件比较是shell脚本中最强大和最常用的一类比较。文件比较命令能够测试Linux文件系统上的文件状态和路径。
    文件比较的几种常用用法:
             -e /path/to       判断文件是否存在
             -f /path/to        判断文件是否存在并且是一个文件
             -d /path/to       判断文件是否存在并且是一个目录
             -r /path/to        判断文件是否存在并且可读
             -w /path/to       判断文件是否存在并可写
             -x /path/to        判断文件是否存在并且可执行
             -s /path/to        判断文件是否存在并且不为空
    下面以一个例子说明:
           FILE=/tmp/test
           if  [  -e $FILE ]; then
                if [ -f $FILE ]; then
                     echo "It  is a file."
                 else
                     echo "It isn't a file."
                      if [  -f $FILE/a.sh ]; then
                                echo "$FILE/a.sh  is a file."
                       fi                     
                   fi
            else
               echo "$FILE  is not  exist."
            fi

    八、函数
    编写比较复杂的shell脚本时,完成具体任务的代码可能需要重复使用。但重复编写相同的脚本代码令人厌烦。所以重复代码块最好只需编写一次,然后在脚本的任意位置就可以引用这个代码块,而不必重复编写。bash  shell提供满足这种要求的特征。函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。每当需要在脚本中使用这样的代码块时,只需引用该代码块被赋予的函数名称即可。下面讲述如何创建和使用函数。
    1、创建函数
    在bash shell脚本中创建函数可以使用两种格式。一种是使用关键字function,后跟代码块的函数名:
          function   name {
             commands         
           }
    name属性定义可该函数的唯一名称。脚本中自定义的每个函数都必须赋予唯一的名称。
    脚本中定义函数还有另一种格式,它更接近一般编程语言定义函数的方式:
          name() {
          commands
          }
        
   2、使用函数
   要在脚本中使用函数,相应函数名需要在脚本行中指定。
   下面先看一个小例子。使用两种方法定义函数 。
          function   test1 {
             echo "The first method!"
              }
         test2(){
             echo "The second method!"
           }
         test1
         test2
    脚本执行结果为:
            The first method!
            The second method!

    3、返回值
    默认情况下,函数的退出状态是函数的最后一条命令返回的退出状态。函数执行完毕之后,可以使用$?来确定函数的退出状态。
      以试图查看一个不存在的文件为例。
        test1(){
           ls -l  testfile
           echo  ”Trying to open the file.“
         }
        test1
        echo "The exit status is:$?"
   脚本执行结果为:
        Linux脚本编程中常用的知识点(二)_函数_06

   从执行结果可以看出,虽然函数中有一条命令运行失败,但是最后的echo语句执行成功,所以函数的退出状态仍然是0。因此,使用函数的默认退出状态是一种危险的做法。此时我们可以使用return命令或使用函数输出。
   1)使用return命令
         使用return命令可以使函数以特定退出状态退出函数。
           show() {
               read -p "Enter a number:"   Num
               return $ [ $Num * 2 ]
            }
           show
           echo "The new number is :$?"
    此时$?的值就是用户输入数字的2倍。
    但是使用return时,退出状态必须小于256,所以函数结果生成的整数值必须小于256。数据大于256将返回错误值。如果想要返回更大的整数值或字符串,就不能使用return方法。要使用第二种方法。
    2)使用函数输出
    正如命令输出可以捕获并存放在shell变量中一样,函数的输出也可以捕获并存放在shell变量中。这种方法可以从函数获取任意类型的输出并给变量赋值: result=`show`  
           show() {
               read -p "Enter a number:"   Num
               echo  $ [ $Num * 2 ]
            }
           result=`show`
           echo "The new number is:$result"
  执行脚本:
          Linux脚本编程中常用的知识点(二)_函数_07

 

    4、在函数中使用变量
    函数可以使用标准参数环境变量来表示命令行传递给函数的参数。例如,函数名在变量$0中定义,函数命令行的其他参数使用变量$1和$2等定义。专用变量$#可以用来确定传递给函数的参数数目。
    
在脚本中指定函数时,必须在函数所在命令行提供参数,如:jage   10  23
          jage (){
            if [  $# -eq 0 ] ||  [  $# -gt 2 ]; then
             echo "-1"
           elif [ $# -eq 1 ]; then
             echo "$ [ $1 + $1 ]"
          else
             echo"$ [ $1 + $2 ]"
          fi
        }
         jage
         jage 10
         jage  10  15
         jage  10  15  25 
   执行脚本:
         Linux脚本编程中常用的知识点(二)_函数_08

      Linux脚本编程常用的知识点到此介绍完毕。能否熟练的掌握就在于是否常练习了。孰能生巧,多练习可以能够更快的领会个知识点的精髓。