下面是对程序控制语句的说明:
程序控制语句在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 条件3;then
命令3
else
命令4
fi
while循环
while 条件;do #当满足条件则循环停止
命令
控制条件 #控制条件满足的趋向,防止陷入死循环
done
下面是几个关于if和while的shell 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"
#使用awk、sed与通道的配合逐步的将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