下面是对程序控制语句的说明:

程序控制语句在shell编程中一般是作为循环的控制条件,现在就介绍一下test表达式的用法:

表达式  ]  [[  表达式  ]]在表达式的前后必须有空格,这些test语句和表达式主要实现的是条件测试的功能,条件测试的种类有3种,分别是整数测试、字符串测试和文件测试;

证书测试即判断两个数值大小,字符串测试辨别两字符串是否相同以及换算的ASCII码的大小,文件测试一个文件是不是很具有可读、可写、可执行、文件的属性等等这些都是文件判断。

下面对三种测试方法所使用的条件进行阐述:

整数测试,其表达式是双目表达式,进行操作符前后数值的比较。

条件表达方法如下:

-lt  小于 lessthan

-gt 大于 greaterthan

-le 小于等于 lessthan  equal

-ge 大于等于 greaterthan  equal

-eq 等于 equal

-ne 不等于 not equal

eg

[  $A  –lt  $B  ]

 

字符串测试,表达式是双目测试,操作数前后字符串进行比较

= = 等于                            -z 判断字符串是否为空(空为真,非空位假)

>大于                          -n 判断字符串是否为非空

<小于                          != 不等于

 

文件测试,表达式为单目表达式,对操作数后面的文件进行判断

-e 判断文件时是否存在                    -s 判断文件是否为空

-d 判断文件时都是目录文件            -O判断属主是否为发起者

-f 判断文件是否为普通文件             -L/h 判断文件是否为连接/符号链接文件

-r 判断文件当前用户权限是否为可读      -w 判断文件当前用户权限是否为可写

-x 判断文件当前用户权限是否为可执行

 

注意:

在中括号 [ ] 内的每个组件都需要有空格键来分隔;

在中括号内的变量,最好都以双引号括起来;

在中括号内的常量,最好都以单或双引号括起来;

 

下面介绍几种判断语句

if判断语句 while循环语句

单分支

if 条件 then

       命令

fi

双分支

if 条件 then

       命令1

else

       命令2

fi

多分枝

if 条件 then

       命令1

elif 条件;then

       命令2

elif 条件3then

命令3

else

       命令4

fi

 

while循环

while 条件;do #当满足条件则循环停止

       命令

控制条件      #控制条件满足的趋向,防止陷入死循环

done

 

下面是几个关于ifwhileshell script实例:

写一个脚本:

1、判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;

2、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。

执行格式$ ./script-test.sh 任意脚本

  1 #!/bin/bash

  2 #

  3 bash -n $1 &> /dev/null  

  4 C=$?                           #判断目的脚本是否有错,无错C=0,有错C!=0

  5 if [ "$C" -ne '0' ];then       #如果有错C!=0则执行下面语句

  6         read -p "there is something wrong in you script. press Q/q to quit,    or press any key to edit:" A                #从键盘读取,赋值给变量A

  7         AA=`echo $A | tr 'A-Z' 'a-z'`   

                                   #将键入的字符统一转换为小写,赋值给变量AA

  8 else

  9         AA='q'                 #如果没错直接将q赋值给变量AA

 10 fi

 11 while  [ "$AA" != "q" ];do     #如果AA的值不等于q则开始while循环,即此脚本有错且键入的是任意键

 12         vim $1                 #vim打开脚本,次步骤完毕继续向下执行while循环中的剩余语句

 13         bash -n $1 &> /dev/null#继续检测vim编辑完璧的脚本是否有错

 14         D=$?

 15         if [ "$D" -ne '0' ];then

                                #如果仍旧有错继续提示从键盘键入信息

 16                 read -p "your script still have something wrong. press Q/q     to quit,or press any key to edit it again:" B

 17                 AA=`echo $B | tr 'A-Z' 'a-z'`

 18         else

 19                 AA='q'                  #如果此时脚本未检测出问题,则将AA赋值为q

 20         fi                     #跳出if循环,然后判别while条件是否得到满足;满足AA=q 跳出循环;否则继需执行while循环。

 21 done

 

写一个脚本:

1、要求用户从键盘输入一个用户名,判断此用户是否存在,如果存在,则返回此用户的默认shell;如果不存,提示用户不存在。

2、判断完成以后不要退出脚本,而是继续提示N|n(next)用户输入其它用户名以做出下一个判断,而键入其它任意字符可以退出;

执行脚本$./user-test.sh

 

  1 #!/bin/bash

  2 #

  3         read -p "please input a user:" A #提示从键入待检测用户名

  4         id $A &> /dev/null              #判断用户是否存在

  5         C=$?

  6         if [ "$C" = '0' ];then          #如果存在则C值为零

  7                 finger $A | awk '/Shell/{print $4}' 

                                            #输出用户对应的shell

  8         else    

  9                 echo "No such user."    #用户不存在则输出字符串

 10         fi      

 11 read -p "press N/n to continue,any other key to quit:" B

                                            #键入字母,选择是继续还是跳出程序

 12 BB=`echo $B | tr 'A-Z' 'a-z' `          #转换大小写

 13 while [ "$BB" == 'n' ];do               #只有变量的值是n时,在进入while循环

 14         read -p "please input a user:" A #若进入while循环则从新提示输出用户名

 15         id $A &> /dev/null

 16         C=$?

 17         if [ "$C" = '0' ];then          #对新键入用户名进行判断

 18                 finger $A | awk '/Shell/{print $4}'

 19         else    

 20                 echo "No such user."

 21         fi      

 22 read -p "press N/n to continue,any other key to quit:" B

                                            #循环结尾再次询问是否继续循环

 23 BB=`echo $B | tr 'A-Z' 'a-z' `

 24 done

 

写一个脚本:

1、向系统中添加20个用户,名字为linuxer1-linuxer20,密码分别为其用户名,要使用while循环;

2、要求:在添加每个用户之前事先判断用户是否存在,如果已经存在,则不再添加此用户;

3、添加完成后,显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码,形如

   stu1, UID: 1000, GID: 1000

1 #!/bin/bash

  2 #

  3 let I=1                                 #初始化变量I值为1

  4 while [ "$I" -ne '21' ];do              #设置循环范围

  5         id linuxer$I &> /dev/null       #判断用户是否存在

  6         if [ "$?" -ne '0' ];then        #如果不存在则创建

  7                 useradd linuxer$I

  8         else                   #否则输出用户存在 

  9                 echo "user:linux$I already exited!"

 10         fi

11 id linuxer$I | awk '{print $1,$2}'| sed "s/uid=\(.*\)(.*)/linuxer$I,UID:\1/g"|sed "s/(.*=/,GID:/g"

#使用awksed与通道的配合逐步的将id命令得到的内容层层替换成题目中要求的格式

 12 I=$[$I+1]                               #循环次数控制条件

 13 done

 

写一个脚本:

1、扫描192.168.0网段内的主机的在线状态,但需要提示用户输入一段IP地址范围,方式是指定起始IP和结束IP;显示结果形如:

   The host 192.168.0.1 is UP.

   The host 192.168.0.2 is DOWN.

2、使用while循环实现;

3、主机在线状态的输出结果既要显示在屏幕上,同时要求所有主机信息也保存一份至/tmp/host_state

4、为/tmp/host_state文件中所有主机状态为DOWN的行的行首添加一个#(井号);

5、分别显示指定范围内所有在线的主机总数和不在线主机总数;

  1 #!/bin/bash

  2 #

  3 let N=0

  4 let M=0

  5 read -p "please input two number for the ip address's range:" A B

  6 if [ "$A" -gt "$B" ];then                #判断输入的两个数,小的作为起始地址,大的作为终点地址

  7         H=$A

  8         I=$B

  9 else

 10         H=$B

 11         I=$A

 12 fi

 13

 14 while [ "$I" -le "$H" ];do               #限定循环范围

 15         ping -w1 -c1 192.168.0.$I &> /dev/null

 16         C=$?                            #判断主机是否ping的通

 17         if [ "$C" -eq '0' ];then    #ping通的输出对应字符,并将输出重定向到指定文件

 18                 echo "The host 192.168.0.$I is UP!"

 19                 echo "The host 192.168.0.$I is UP!" >> /tmp/host_state

 20                 N=$[$N+1]    #ping通主机数累加

 21         else                              #ping不通的主机输出对应字符,并将输出内容重定向到指定文件

 

 22

 23                 echo "The host 192.168.0.$I is DOWN!"

 24                 echo "#The host 192.168.0.$I is DOWN!" >> /tmp/host_state

 25                 M=$[$M+1]

 26         fi

 27 I=$[$I+1]                                    #循环条件累加

 28 done

 29 echo "total up is $N."

 30 echo "total down is $M."               #循环完毕输出统计结果

 

上面几个实例是对if判断和while循环的简单应用。

                                              July 24th 21:19 2011