shell编程之流程控制

1.ifweb

    "if" 表达式 若是条件为真则执行then后面的部分:shell

            if ....; thenexpress

           ....编程

           elif ....; thenbash

           ....ssh

           else函数

           ....oop

           fi测试

      大多数状况下,可使用测试命令来对条件进行测试。好比能够比较字符串、判断文件是否存在及是否可读等等…命令行

    一般用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

                 [ -f "somefile" ] :判断是不是一个文件

                 [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限

                 [ -n "$var" ] :判断 $var变量是否有值

                 [ "$a" = "$b" ] :判断 $a和 $b是否相等

    执行man test能够查看全部测试表达式能够比较和判断的类型。

    直接执行如下脚本:

               #!/bin/sh

               if [ " $SHELL" = "/bin/bash" ]; then

                    echo "your login shell is the bash (bourne again shell)"

               else

                    echo "your login shell is not bash but  $SHELL"

               fi

    变量 $SHELL包含了登陆shell的名称,咱们和/bin/bash进行了比较。


      快捷操做符

      熟悉C语言的朋友可能会很喜欢下面的表达式:

                  [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"

    这里 && 就是一个快捷操做符,若是左边的表达式为真则执行右边的语句。您也能够认为是逻辑运算中的与操做。上例中表示若是/etc/shadow文件存在则打印” This computer uses shadow passwords”。一样或操做(||)在shell编程中也是可用的。这里有个例子:

                 #!/bin/sh

                 mailfolder=/var/spool/mail/james

                 [ -r " $mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }

                 echo " $mailfolder has mail from:"

                 grep "^From "  $mailfolder

      该脚本首先判断mailfolder是否可读。若是可读则打印该文件中的"From" 一行。若是不可读则或操做生效,打印错误信息后脚本退出。这里有个问题,那就是咱们必须有两个命令:

  -打印错误信息

  -退出程序

    咱们使用花括号以匿名函数的形式将两个命令放到一块儿做为一个命令使用。通常函数将在下文说起。

    不用与和或操做符,咱们也能够用if表达式做任何事情,可是使用与或操做符会更便利不少。


2.case

case :表达式能够用来匹配一个给定的字符串,而不是数字。

       case ... in

            ...) do something here ;;

       esac

让咱们看一个例子。 file命令能够辨别出一个给定文件的文件类型,好比:

   file lf.gz

  这将返回:

   lf.gz: gzip compressed data, deflated, original filename,

   last modified: Mon Aug 27 23:09:18 2001, os: Unix

  咱们利用这一点写了一个叫作smartzip的脚本,该脚本能够自动解压bzip2, gzip 和zip类型的压缩文件:

#!/bin/sh

ftype=`file "$1"`

case "$ftype" in

   " $1: Zip archive"*)

  unzip " $1" ;;

    " $1: gzip compressed"*)

  gunzip " $1" ;;

    " $1: bzip2 compressed"*)

  bunzip2 " $1" ;;

     *) echo "File  $1 can not be uncompressed with smartzip";;

    esac


    您可能注意到咱们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。

也就是说,当咱们运行:

smartzip articles.zip

$1 就是字符串 articles.zip


3. selsect

    select 表达式是一种bash的扩展应用,尤为擅长于交互式使用。用户能够从一组不一样的值中进行选择。

select var in ... ; do

    break

done

.... now  $var can be used ....


下面是一个例子:

     #!/bin/sh

     echo "What is your favourite OS?"

     select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do

   break

     done

     echo "You have selected $var"


下面是该脚本运行的结果:

What is your favourite OS?

       1) Linux

       2) Gnu Hurd

       3) Free BSD

       4) Other

       #? 1

       You have selected Linux

注:var是个变量,能够换成其它的值。break用来跳出循环,若是没有break则一直循环下去。done与select对应。


4.loop

loop表达式:

    while ...; do

         ....

    done


    while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.

    关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。


for-loop表达式查看一个字符串列表 (字符串用空格分隔) 而后将其赋给一个变量:

1,for var in ....; do

     ....

     done


在下面的例子中,将分别打印ABC到屏幕上:

#!/bin/sh

    for var in A B C ; do

   echo "var is  $var"

done


2,for (( 条件一; 条件二; 条件三 );do

       ...

   done


例:

for ((i=1;i<10;i= $[$i+1]));do

     echo "a"

done


输出:


a

a

a

a

a

a

a

a

a


条件一:这能够当作是『初始值』,如上面的例子中,初始值是 i=1 啦!

条件二:这能够当作是『符合值』,如上面的例子中,当 i<=10的时候都是符合条件的!

条件三:这能够当作是『步阶』!也就是说,i每次都加一!因此啦!上面的例子是说:由i=1 开始到 i<= 100 ,每次 i 都加一来执行底下的程序段(就是 s=s+i ),当 i >100(也就是 i=101 )就跳出这一段程序段!


下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:

#!/bin/sh

# list a content summary of a number of RPM packages

# USAGE: showrpm rpmfile1 rpmfile2 ...

# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm

   for rpmpackage in  $*; do

if [ -r " $rpmpackage" ];then

   echo "===============  $rpmpackage =============="

   rpm -qi -p  $rpmpackage

else

   echo "ERROR: cannot read file  $rpmpackage"

fi

done

   这里出现了第二个特殊的变量 $*,该变量包含了全部输入的命令行参数值。

   若是您运行showrpm openssh.rpm w3m.rpm webgrep.rpm

   此时  $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.


『until:直到条件相同的时候才离开程序』;

『while:当条件相同的时候,就继续作!』


until [ condition1 ] && { || } [ condition2 ] ...

相关文章
相关标签/搜索