目录
一、条件测试
- 如果要使得Shell脚本程序具备一定的“智能”,第一个问题便是如何区分不同的情况以执行何种操作
- Shell环境根据命令执行后的返回值状态($?)来判断是否执行成功,当返回值为0时表示成功,否则非0值表示失败。
1.1 test命令
- 可以对特定的条件表达进行测试,,返回值为0表示成立。
基本格式:
test 条件表达式
[ 条件表达式 ]
- 这两条作用完全相同,后一种更常用更贴近编程习惯。注: 后一种方括号与条件表达式之间至少一个空格进行分隔。
1.1.1 文件测试
- 根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等
- 常见操作选项
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exit)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试是否设置有可执行(Excute)权限
例:
[root@localhost ~]# [ -d /dev/sr0 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /dev/sr0 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e /dev/cdrom ]&& echo "YES" ## 文件是否为目录,是的话输出YES
YES
1.1.2 文件之间判断
- 两个文件的比较,常用的选项有:
-nt:判断文件A是否比文件B新
-ot:判断文件A是否比文件B旧
-ef:判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode
例:
[root@localhost ~]# touch a
[root@localhost ~]# touch b
[root@localhost ~]# [ a -ot b ]&& echo "YES" || echo "NO" ## a是否比b文件旧
YES
[root@localhost ~]# [ a -nt b ]&& echo "YES" || echo "NO" ## a是否比b文件新
NO
[root@localhost ~]# ln a c ## 创建a文件的硬连接c
[root@localhost ~]# [ a -ef c ]&& echo "YES" || echo "NO"
YES ## 指向同一个inode
二 、整数值比较
- 根据给定的两个整数值,判断第一个数与第二个数的关系,如 是否大于、等于、小于第二个数。
- 常用选项如下:
-eq: 第一个数等于(Equal)第二个数
-ne:第一个数不等于(Not Equal)第二个数
-gt:第一个大于(Greater Than)第二个数
-lt:第一个数小于(Lesser Than)第二个数
-le:第一个数小于或等于(Lesser or Equal)第二个数
-ge:第一个数大于或等于(Greater or Equal)第二个数
- 整数值比较在Shell脚本编写中应用较多。可以用来判断已登录用户数量、开启进程数、磁盘使用率是否达标等。
[root@localhost ~]# unum=`who | wc -l`
[root@localhost ~]# [ $unum -gt 5 ]&& echo "litter"|| echo "Too many"
litter ## 查看登录的用户数量,大于等于5个发出Too many 的报警
三、字符串比较
- 字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,可以用来判断用户输入的位置参数是否符合要求。
- 常用选项如下
=: 第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反
-z:检查字符串是否(Zero),对于未定义或赋予空值的变量将视为空串。
例:
[root@localhost ~]# echo $LANG ## 查看当前语言环境
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ]&& echo "Not en.US" ## 字符串测试结果 (不等于)
Not en.US
四、逻辑测试
- 逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同条件时,判断是根据这些条件同时成立还是只要有其中一个成立等情况,需要有一个测试的过程。
符号 | 意思 |
---|---|
&& | 逻辑与,表示 “而且”,且只有当两个条件都成立时,整个测试命令的返回值才为0(结果成立)。使用Test命令时,“&&”可改为 “-a” |
|| | 逻辑或,表示“或者”,只要前后两个命令有一个成立,整个测试命令的返回值才为0(结果成立)。使用Test命令时,“||”可改为 “-o” |
! | 逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。 |
五 、if语句
Shell脚本应用中,if语句时最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果………那么…………)。
- 根据不同的复杂程度,if语句的选择结构可以分为三种基本类型,适用于不同的应用场合
5.1 单分支的if语句
- if语句的“分支”指的是不同测试结果所对应的执行语句(一条或则多条)。对于但分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。
if 条件测试操作
then
命令序列
fi
- 流程图
5.2 双分支的if语句
- 双分支的选择结构,要求针对“条件成立” “条件不成立”两种情况分别执行不同的操作。
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
- 流程图
5.3 多分支的if语句
- 由于if语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。
- if 语句的嵌套在编写Shell脚本时并不常用,因为多重嵌套容易使程序结构更复杂。
- 基本格式如下
if 条件测试语句 1
then
命令序列 1
elif 条件测试语句 2
then
命令序列 2
else
命令序列 3
fi
- 流程图
5.3 if多分支语句的应用
- 猜拳 ,用列举法使用if多分支语句
#! /bin/bash
read -p "请输入您的出拳手势 其中 0代表拳头 1代表剪刀 2代表布 " A
B=$[$RANDOM%3]
if [ $A -ge 0 ]&&[ $A -le 2 ]
then
if [ $A -eq 0 ]
then
if [ $B -eq 0 ]
then
echo "您出的是拳头"
echo "电脑出的也是拳头"
echo "这局是平局"
elif [ $B -eq 1 ]
then
echo "您出的是拳头"
echo "电脑出的是剪刀"
echo "您赢了!"
else
echo "您出的是拳头"
echo "电脑出的是布"
echo "您输了,电脑赢了!"
fi
elif [ $A -eq 1 ]
then
if [ $B -eq 0 ]
then
echo "您出的是剪刀"
echo "电脑出的是拳头"
echo "您输了,电脑赢了"
elif [ $B -eq 1 ]
then
echo "您出的是剪刀"
echo "电脑出的也是剪刀"
echo "这局是平局"
else
echo "您出的是剪刀"
echo "电脑出的是布"
echo "您赢了!"
fi
elif [ $A -eq 2 ]
then
if [ $B -eq 0 ]
then
echo "您出的是布"
echo "电脑出的是拳头"
echo "您赢了"
elif [ $B -eq 1 ]
then
echo "您出的是布"
echo "电脑出的是剪刀"
echo "您输了,电脑赢了"
else
echo "您出的是布"
echo "电脑出的也是布"
echo "这局是平局"
fi
else
echo ""
fi
else
echo "请输入正确的数字"
fi