在Bash Shell中,流程控制命令有两个类:“选择”和“循环”。属于“选择”的有:if,case;属于“循环”的有:for,while,until;命令select既属于“选择”,也属于“循环”。

一.简易的if语法:if-then-else

if ((2<10)); then

  echo '真'

fi

结果为:真

也可以这样写:

if ((2<10)); then echo '真';fi

if-then-else

例子:

          if [-d /root/tmp]; then

          echo '/root/tmp目录存在'

           else

            echo '/root/tmp目录不存在'

            fi

使用[]做条件测试,-d会检测这个/root/tmp是否存在,如果判断为真,就显示目录的存在的信息,如果为假,就会显示目录不存在的信息

if的完整语法

if 条件测试1; then

   命令区域1

elif 条件测试2;then

    命令区域2

else

   命令区域3

fi

其中elif可以多行,数量不限,但else只能有一行。

条件测试的写法

1.执行某一个命令的结果

例子:

         #! /bin/bash

            if grep -q "rm" fn.sh; then

               echo "find rm command"

            else

                  echo "not find"

             fi

在条件测试中,执行的命令是:grep -q "rm" fn.sh,它是寻找fn.sh文件里是否有关键词rm。

2.传回某一个命令执行结果的相反值

其形式为:!命令

注意,!和命令之间要有空格符

例子:#! /bin/bash

 

   if ! grep -q "rm" fn.sh; then

      echo "not find"

   else

          echo "find rm command"

fi

在条件测试中,执行的命令是:!grep -q "rm" fn.sh. !表示要传回相反的结果。

3.使用复合命令:((算式))

使用Bash关键词‘[[   ]]’组成的式子:[[ 判断式 ]]

注意:[[的后面、]]的前面,都至少要一个空格。

#! /bin/bash

 if [[ str>xyz ]]; then

   echo "字符串str比较大"

else

  echo "字符串str比较小"

4.使用内置命令:test 判断式

test是bash的内置命令,可传回“判断式”的结果

#! /bin/bash

if test "str" \> "xyz"

  echo "字符串str比较大"

else

   echo "字符串str比较小"

fi

需特别注意的是:大于符号>对bash而言是特殊字符,要用\转义。

5.使用内置命令:[ ]

其形式为:[  判断式 ]

[ ]和test用法相同

例子:

 #! /bin/bash

if [ "str" \> "xyz" ]; then

  echo "字符串str比较大"

else

  echo "字符串str比较小"

fi

6.使用-a、-o进行逻辑组合

例子:

    [ -r filename -a -x filename ]

如果filename可读且可执行,则为真。-a 即“且”之意。

 [ -r filename -o -x filename ]

如果filename 可读或可执行,则为真。-o即“或”之意。

7.命令1 && 命令2

&&称为逻辑的AND,其运作的方式:如果“命令1”执行结果为真,才会执行“命令2”。

例如:

        [ -z "$PS1" ]  && return

先判断$PS1变量值是否为空,如果为空,就执行return命令,由子shell环境返回到父shell,这等于是结束执行该script。

例如:

       [ -f /proc/net/if_inet6 ]  && echo '这部主机支持IPv6'

判断/proc/net/if_inet6是否存在,如果存在,就显示支持IPv6协议。

往后,凡是“[  判断式 ] && 指令”的形式,就视为一种隐性的if-then语法。

8.命令1 || 命令2

运作方式为:如果“命令1”执行为假,才会执行“命令2”

例如:

#! /bin/bash

a=200

if grep -q "rm" fn.sh || [ $a -lt 100 ] ; then

       echo "OK"

else

        echo "no OK"

fi

9.case的语法

case的语法结构如下:

 case 待测项 in

      样式串行 1 ) 命令区域1 ;;

       样式串行2  ) 命令区域2 ;;

        。。。。

         *) 命令区域;;

esac

10. for循环

for循环的运作方式,是将串行的元素一一取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done之间),只到所有元素取尽为止。

for的语法结构如下:

for 变量 in 串行

do

     命令区域

done

说明:将串行中的字段迭代放入变量中,接着重复执行do和done之间的命令区域。

用例1:

for i in 1 2 3 4 5

do

    echo $i

done

11.while 循环

while 循环的语法:

   while 条件测试

   do

       命令区域

   done

范例:

#! /bin/bash

   declare -i i=1

    declare -i sum=0

  while ((i<=10))

  do

      let sum+=i

      let ++i

    done

     echo $sum

说明:先是声明i和sum为整数型;条件测试,只要i的值小于或等于10,就执行循环。sum+=i和sum=sum+i是一样的,sum累加上i。