linux中Shell脚本应用(二)

Shell脚本应用(二)

[重点]

Ø整数值比较/逻辑测试

ØIf语句的结构及应用

2.1条件测试操作

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功。当返回值为0时表示成功,否则(非0值)表示失败或异常

使用专门的测试工具---test命令,可对特定条件进行测试,并根据返回值来判断条件(返回值0表示条件成立)

使用test测试包括两种形式:

Test 条件表达式或者      [  条件表达式 ]

这两种方式作用完全相同,但通常后一种形式更为常用。

注意:方括号[  ]与条件表达式之间需要至少一个空格进行分隔

比较常用的条件操作:

文件测试、整数值比较、字符窜比较、以及针对抖个条件的逻辑测试。

1.文件测试:根据给定的路径名称,判断对应的是文件还是目录,或者判断文件上是否可读、可写、可执行等。

常见的操作选项如下:使用时将测试对象放在操作选项之后即可

l-d:测试是否为目录(directory

l-e:测试目录或文件是否存在(exsit

l-f:测试文件或目录是否存在(file

l-r:测试当前用户是否有权限读取(read

l-w:测试当前用户是否有权限写入(write

l-x:测试是否设置有可执行(excute)权限

[  -d  /media/cdrom/ ]

    Echo  $?

    Ls  -ld /media/cdrom/

为了更直观的查看测试结果,可以结合命令分隔符“&&”和echo命令一起使用,当条件成立时直接输出“yes”。其中“&&”符号表示“而且”的关系,只有当前前边的命令执行成功后才会执行后边的命令,否则后边的命令将会被忽略。

列:[  -d  /media/cdrom/Server/  ] && echo “YES”

2.整数值比较:根据给定的两个整数值,判断第1个数是否大于、等于、小于….2个数

整数值比较的常用操作选项如下:(使用时将操作选项放在要比较的两个整数之间)

l-eq:第1个数等于(equal)第2个数

l-ne:第1个数不等于(not  equal)第2个数

l-gt:第1个数大于(greater than)第2个数

l-lt:第1个数小于(lesser than)第2个数

l-le:第1个数小于等于(lesser or equal)第2个数

l-ge:第1个数大于等于(greater or equal)第2个数

列:who |wc  -l

[  $Unum -gt  5  ] &&  echo “Too many”

Free �Cm: 表示已MB为单位输出内存信息

列:freeCC=$(free  -m | grep “cache:”| awk ‘{print $4}’)

[  $freeCC -lt  1024  ] &&  echo   ${freeCC}MB

3.字符串比较:通常用来检查用户输入/系统环境是否满足条件

在提供交互式操作的shell脚本中,也可用于判断用户输入参数是否符合要求

字符串常用操作选项:

l=:1个字符串与第2个字符串相同

l!=:1个字符串与第2个字符串不相同,其中!取反的意思

l-z:检查字符是否为空(zero),对于未定义或赋予空值的变量视为空串

:echo  $LANG        //查看当前语言环境

 [  $LANG !=  “en.US”  ] &&  echo  “Not en.US”   //字符串测试结果

shell脚本应用中,经常需要用户输入yesno来确认某个任务

: read  -p “是否覆盖现有文件(yes/no)?”  ACK

  [  $ACK  =“yes” ]  &&  echo “覆盖

4.逻辑测试:判断两个或多个条件之间的依赖关系

常用逻辑测试的操作选项:

l&&:逻辑与,表示“而且”的意思,只有当前后两个条件都成立时,整个测试名令的返回值才为0(结果成立)。使用test名令时,“||”可改为“-a

l||:逻辑或,表示“或者”的意思,只要前后两个条件中有一个成立时,整个测试名令的返回值才为0(结果成立)。使用test名令时,“||”可改为“-o

l! :逻辑否,表示“不”的意思,只有当条件不成立时,整个测试名令的返回值才为0(结果成立)。

注:  “&&” “||”通常也用于间隔不同名令操作

如:make  &&  make install          

列:判断当前linux系统内核版本是否大于2.4

  Uname  -r

 Mnum= $(uname �Cr | awk  -F.  ‘{print $1}’)

 Snum=$(uname  -r  | awk -F. ‘{print $2}’)

 [  $Mnum  -eq 2 ]  &&  [ $Snum  -gt 4 ]  && echo  “符合要求

2.2使用if语句

使用专用的if语句,可以更好的整理脚本结构,使得层次分明,清晰易懂

2.2.1 If语句结构

shell脚本应用中,if语句是最常用的一种流程控制方式。

If选择结构可以分为三种不同的基本类型:适用于不同的应用场合。

1.单分支结构

If语句的“分支”指的的是不同测试结果对应的执行语句(一条或多条)。

对于单分支语句,只有在“条件成立”时才会执行相应的代码,否则不作任何操作。

单分支If语句语法格式:

if 条件测试

                    then  

                       命令序列

                    fi


单分支If结构的执行流程:

首次判断条件测试的操作结果,如果返回值为0 表示条件成立,则执行then后面的名令序列,一直到遇见fi为止表示结束,继续执行其他脚本代码;如果返回值不为0,则忽略then后面的命令序列,直接跳至fi 行以后执行其他脚本代码。

单分支If语句结构:

2.双分支的if语句

双分支的if语句格式:if  条件测试操作

                then

命令序列1

                 else

                           命令序列2

                fi

双分支的if结构执行流程:

首先判断条件测试的操作结果,如果条件成立,则执行then后面的命令序列1,忽略else及后面的命令序列2,直到遇见fi 结束判断;如果条件不成立,则忽略then后面的命令序列1,直接跳至else及后面的命令序列2执行,直到遇见fi 结束判断。

双分支的if语句结构:

3.多分支的if语句

多分支的if语句的语法格式:if  条件测试操作1

then

命令序列1

                            elif  条件测试操作2

                             Then

                                  命令序列2

                             else

                                   命令序列2

                              fi

多分支的if结构的执行流程:

首先判断条件测试的操作1的结果,如果条件1成立,则执行命令序列1,然后跳至fi 结束判断;如果条件1不成立,则继续判断条件测试操作2的结果,如果条件2成立,则执行命令序列2,然后跳至fi 结束判断;……如果所有的条件多不满足,则执行else后面的命令序列n,然后遇见fi 结束判断。

多分支的if语句结构:

2.2.2 if语句应用

单分支语句应用:

列:vi /opt/chkifroot.sh

#!/bin/bash

If [  “$USER”  !=”root” ]

then

 echo “错误:非root用户,权限不足

exit  1     //非正常退出

fi

#chmod  +x  chkifroot.Sh

#/opt/chkfiroot.sh

列:

双分支 if语句应用:

编写连通性测试脚本pinghost.sh

列:vi pinghost.sh

  #!/bin/bash

 Ping  -c 3  -I 0.2 �Cw 3 $1 &>  /dev/null

 If  [  $? �Ceq  0  ]

 then

Echo “host  $1 is up”

    else

      Echo  “host  $1 is down ”

   fi

#chmod +x pinghost.sh

#./pinghost.sh 192.168.4.1

多分枝语句因应用:

根据多个互斥的条件执行不同的操作,实际等同于嵌套使用的if语句。

编写一个成绩分档的脚本

列: vi  gradediv.sh

#!/bin/bash

Read �Cp “请输入您的分数(0-100”  GRADE

If  [  $GRADE �Cge $5  ] && [  $GRADE -le  100  ]

Then

 Echo  “ $GRADE 分,优秀

elif [  $GRADE  -ge 70  ]  && [ $GRADE  -le  84  ]

then

 echo “$GRADE 分,合格

else

  echo  “$GRADE 分,不合格

f

#chmod  +x  gradeediv.sh

#./ gradeediv.sh



本文出自 “敏而好学” 博客,谢绝转载!

你可能感兴趣的:(shell脚本,linux脚本,郑彦茹)