Shell作为一种解释类型的脚本编程语言,同样包含顺序,分支,循环这些基本的程序控制结构。通过使用分支,循环等控制语句,可以编写出应用更灵活,功能更强大的Shell管理脚本.一下是对if,for,while语句的应用,shell脚本程序的结构控制,case语句,shell函数应用等的介绍:
test命令
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式
[ 条件表达式 ] 中间至少相隔一个空格
测试文件状态:
-d:测试是否为目录 输入 [ -d /etc/vsftpd ] 后再输入 echo $? 返回值为0表示测试条件成立,为1时表示不成立
-e:测试目录或文件是否存在 [ -e /media/cdrom/Server ] && echo "YES" 返回yes表示测试条件成立,无显示表示失败。
-f:测试是否为文件
-r:测试当前用户是否有读取权限
-w:测试当前用户是否有写入权限
-x:测试当前用户是否有执行权限
-L:测试是否为符号链接文件
数值比较:
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
字符串比较
格式:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
1 2 |
[[email protected] ~] #touch zero.file [[email protected] ~] # [ -z `cat zero.file` ] && echo "YES" 表示为空文件 |
逻辑测试
格式:[ 表达式1 ] 操作符 [ 表达式2 ] ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
当指定的条件不成立时,返回结果为真
单分支if 语句的结构
if 条件测试命令
then 命令序列
fi
例如:如果/boot分区的空间使用超过80%,输出报警信息
1 2 3 4 5 6 |
#!/bin/bash RATE=` df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 ` if [ $RATE -gt 80 ] then echo "Warning,DISK is full!" fi |
双分支的if语句
if 条件测试命令
then 命令序列1
else 命令序列2
fi
例如:判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务
1 2 3 4 5 6 7 8 |
#!/bin/bash service mysqld status &> /dev/null if [ $? - eq 0 ] then echo "mysqld service is running." else /etc/init .d /mysqld restart fi |
多分支的if语句:
if 条件测试命令1 ; then
命令序列1
elif 条件测试命令2 ; then
命令序列2
elif ...
else
命令序列n
fi
for循环语句:
for 变量名 in 取值列表
do
命令序列
done
例如:依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
1 2 3 4 5 6 7 8 9 10 |
# vi showday.sh #!/bin/bash for TM in "Morning" "Noon" "Evening" do echo "The $TM of the day." done [[email protected] ~] # sh showday.sh The Morning of the day. The Noon of the day. The Evening of the day |
例如:对于使用/bin/bash作为登录shell的系统用户,检查他们在/opt目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户账号。
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash DIR= "/opt" LMT=100 ValidUsers=` grep "/bin/bash" /etc/passwd | cut -d ":" -f 1` for UserName in $ValidUsers do Num=` find $DIR -user $UserName | wc -l` if [ $Num -gt $LMT ] ; then echo "$UserName have $Num files." fi done |
while语句的结构:
while 命令或表达式
do
命令列表
done
例如:批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”
1 2 3 4 5 6 7 8 |
#!/bin/bash i=1 while [ $i - le 20 ] do useradd stu$i echo "123456" | passwd --stdin stu$i &> /dev/null i=` expr $i + 1` done |
case语句:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认执行的命令序列
esac
例如:提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash read -p "Press some key, then press Return:“ KEY case "$KEY“ in [a-z]|[A-Z]) echo "It's a letter." ;; [0-9]) echo "It's a digit." ;; *) echo "It's function keys、Spacebar or other keys. " esac |
until循环:和while循环类似,只不过while是当条件成立时执行,而until是当测试条件成立时结束循环。
until 条件测试命令
do
命令序列
done
shift语句:用于迁移位置变量,将 $1~$9 依次向左传递
例如,若当前脚本程序获得的位置变量如下:
$1=file1、$2=file2、$3=file3、$4=file4
则执行一次shift命令后,各位置变量为:
$1=file2、$2=file3、$3=file4
再次执行shift命令后,各位置变量为:
$1=file3、$2=file4
应用示例:
通过命令行参数传递多个整数值,并计算总和
1 2 3 4 5 6 7 8 9 10 11 |
# vi showday.sh #!/bin/bash Result=0 while [ $ # -gt 0 ] do Result=` expr $Result + $1` shift done echo "The sum is : $Result" [[email protected] ~] # ./sumer.sh 12 34 56 The sum is : 102 |
break 命令:在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句
continue:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环
Shell 函数的应用:在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
格式:
function 函数名 {
命令序列
}
或者把function去掉也可以。