~~~~~~~~ 因为想要面对一个新的开始,一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些,就不叫新的开始,而叫逃亡。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ————玛丽亚·杜埃尼亚斯
在使用shell脚本程序中,所面临的第一个问题就是如何区分不同的情况以确定程序需要执行何种操作。比如,判断磁盘使用率,超过90%时给用户发送报警信息;判断文件是否存在,不存在则创建文件等,这都是脚本程序判断的一种逻辑。
shell环境会根据命令执行后的返回状态($?)来判断是否执行成功,当返回0时表示执行成功,当返回1时则表示失败或者异常。那么怎么去获取这样的一张状态信息呢?我们使用test命令,可以对特定的条件进行测试,并且能根据返回值来判断是否成立。
test命令格式:
1. test 条件表达式
2. [ 条件表达式 ]
这两种方式作用是一样的,但通常后一种形式更常用,但是注意方括号和条件表达式之间至少需要一个空格进行分隔,否则报错。
文件测试文件测试是指根据给定的路径名称,来判断对应的是文件还是目录,或者是文件是否存在又或者是可读、可写、可执行等。文件测试的常见操作选项如下:
-d 测试是否为目录(Directory)
-e 测试目录或文件是否存在(Exist)
-f 测试是否为文件(File)
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试是否设置有可执行(Excute)权限
通过查看变量($?)的值,可以判断前一步的条件测试结果。
举例说明
判断/mnt/cdrom目录是否存在?
# test -e /mnt/cdrom
# echo $?
0
判断/mnt/cdrom是不是目录?
# test -d /mnt/cdrom
# echo $?
0
或
# [ -d /mnt/cdrom ]
# echo $?
0
为了操作简便,还可以直接一条语句搞定。
举例说明
#[ -d /media/cdrom ]&&echo “YES”
//无输出表示该目录不存在
YES //输出“YES”表示该目录存在
[ -d /media/cdrom ]&&echo “YES” || echo “NO”
NO //输出NO表示该目录不存在
YES //输出“YES”表示该目录存在
使用[[ 条件表达式 ]]也可以进行条件测试
[[ -d /media/cdrom ]]&&echo “YES” || echo “NO”
test还有比较两个文件的常用选项:
-nt 判断文件A是否比文件B新
-ot 判断文件A是否比文件B旧
-ef 判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode
举例说明
#touch a
#touch b
#test a -ot b&&echo “YES” || echo “NO”
#[ a -ot b ]&&echo “YES” || echo “NO”
#test a -ef b &&echo “YES” || echo “NO”
#ln a c
#test a -ef c &&echo “YES” || echo “NO”
整数值比较
整数值比较指的是根据给定的两个整数值,来判断第一个数与第二个数的关系。整数值比较在shell脚本编写中的应用比较多,例如可以用来判断已登录用户的数量,开启进程数,磁盘使用率是否超标,以及软件版本号是否符合要求等。常用的操作选项如下:
-eq a等于b
-ne a不等于b
-gt a大于b
-lt a小于b
-le a小于或等于b
-ge a大于或等于b
举例说明
判断当前已登录用户数,当超过5个时输出“Too many”
# Unum=`who|wc -l`
# [ $Unum -gt 5 ]&&echo "too many."
too many.
判断当前可用空闲内存(free)大小,当低于1024MB时输出具体数值
# FreeCC=$(free -m|grep Mem|awk '{print $4}')
# [ $FreeCC -lt 1024 ]&&echo ${FreeCC}MB
字符串比较
字符串比较通常用来检查用户的输入、系统环境变量等是否满足条件,在提供交互式操作的shell脚本中,也可以用来判断用户输入的位置参数是否符合要求。常用的操作选项如下:
= 第一个字符串与第二个字符串相同
!= 第一个字符串与第二个字符串不相同
-z 检查字符串为空(zero),对于未定义或赋予空值的变量将视为空串
举例说明
判断当前系统的语言环境,不是en.US时输出“Not en.US”
# echo $LANG
zh_CN.UTF-8
# [ $LANG != "en.US" ]&&echo "Not en.US"
Not en.US
在shell脚本应用中,经常需要用户输入yes或no来确认要执行的任务,在实际使用时还会根据变量“ACK”的取值来执行进一步的操作。比如:
# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
# echo $ACK
yes
# [ $ACK = "yes" ]&&echo "覆盖"
# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?no
# [ $ACK = "no" ]&&echo "不覆盖"
不覆盖
逻辑测试
逻辑测试是用来判断两个或多个条件之间的依赖关系。当存在多个不同的条件时,需要根据逻辑判断这些条件是同时成立还是其中一个成立,使用时放在不同的条件命令之间。常用的逻辑测试操作选项如下:
&& 逻辑与,表示而且,只有当前后两个条件都成立时,整个测试的命令返回值才为0(结果成立)。使用test命令测试时可改为-a
|| 逻辑或,表示或者,只要前后两个条件有一个成立,则整个测试的命令返回值为0(结果成立)。使用test命令测试时可改为-o
! 逻辑否,表示不,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)
举例说明
判断Linux系统的内核版本是否大于2.4
# Mnum=$(uname -r|awk -F. '{print $1}')
# Snum=$(uname -r|awk -F. '{print $2}')
[ $Mnum -gt 2 ]||`[ $Mnum -eq 2 ]&&[$Snum -gt 4]`&&echo "yes" || echo "no"
[root@localhost ~]# test $Mnum -eq 3 -a $Snum -gt 4
[root@localhost ~]# echo $?
0
[root@localhost ~]# test $Mnum -eq 2 -a $Snum -gt 4
[root@localhost ~]# echo $?
1
if语句结构
在shell脚本应用中,if语句是最为常用的一种流程控制的方式,可以用来根据特定的条件,分别执行不同的操作。翻译过来就是如果…那么就…。if语句结构可分为三种基本类型。
单分支if语句语法格式为:
if 条件测试语句
then
命令序列
fi
举例说明
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -ge 60 ]
then
echo "成绩合格"
fi
双分支if语句
语法格式为:
if 条件测试语句
then
命令序列1
else
命令序列2
fi
举例说明
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -ge 60 ]
then
echo "成绩合格"
else
echo "成绩不合格"
fi
多分支if语句
语法格式为:
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
eles
命令序列3
fi
举例说明
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -ge 90 ]
then
echo "成绩优秀"
elif [ $score -ge 60 ]
then
echo "成绩合格"
else
echo "成绩不合格"
fi
相关文章:
shell脚本编程循环语句
linux之shell脚本基础
shell脚本编程之case语句
shell脚本中的函数及调试