文章目录
- 1.条件测试
- 1.1 文件测试
- 1.2 整数值比较
- 1.3 字符串比较
- 1.4 逻辑测试
- 2.if语句的介绍
- 2.1 单分支if语句
- 2.2 双分支if语句
- 2.3 多分支if语句
- case语句结构
1.条件测试
- shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时,表示成功,否则表示失败或异常。
- 使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立。
test命令的两种使用形式:
test 条件表达式
或者
[ 条件表达式1 ] //括号两侧需空格隔开
test常用选项:
- nt:判断文件A是否比B新;
- ot:判断文件A是否比B旧;
- ef:判断两个文件是否为同一个文件,是否指向同一个inode。
示例:
[root@localhost~]# touch a
[root@localhost~]# touch b
[root@localhost~]# test a -ot b && echo 1 || echo 0
1
[root@localhost~]# test a -ef b && echo 1 || echo 0
0
[root@localhost~]# ln a c
[root@localhost~]# test a -ef c && echo 1 || echo 0
1
1.1 文件测试
指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。
命令格式:
[ 操作符 文件或目录 ]
常用的测试操作符:
- -d:测试是否为目录(Directory);
- -e:测试目录或文件是否存在(Exist);
- -f:测试是否为文件(File);
- -r:测试当前用户是否有权限读取(Read);
- -w:测试当前用户是否有权限写入(Write);
- -x:测试当前用户是否有权限执行(eXcute)。
示例:
[root@localhost~]# [-d /media/cdrom ]
[root@localhost~]# echo $?
0 //返回值为0表示条件成立
[root@localhost~]# [-d lmedialcdromlServer 1
[root@localhost~]# echo $?
1 //返回值为1表示条件不成立
[root@localhost一]# [ -d /media/cdrom ] && echo "YES""
YES //&&逻辑与,而且的意思,表示条件成立并输出YES
1.2 整数值比较
整数值比较即判断两个数的关系。
命令格式:
[ 整数1 操作符 整数2 ]
常用的操作符:
- -eq:等于(Equal);
- -ne:不等于(Not Equal);
- -gt:大于(Greater Than);
- -lt:小于(Lesser Than);
- -le:小于或等于(Lesser or Equal);
- -ge:大于或等于(Greater or Equal)。
常用的测试操作符:
[root@localhost ~]# who | wc -l //查看当前已登录用户数
9
[root@localhost ~]# [ $(who | wc -l) -gt 7 ] && echo "Too many." //判断用户是否为5
Too many.
[root@localhost ~]# [ $(who / wc -l) -ge 10 ] && echo "> =10" //判断用户是否>=10
[root@localhost ~]# FreeCC=$(free -m | grep "Mem: " | awk '{print $7}')
[root@localhost ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB //空闲内存是否<1024MB
837
1.3 字符串比较
字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的shell脚本中,也可以用来判断用户输入的位置参数是否符合要求。
命令格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符:
- =:字符串内容相同;
- !=:字符串内容不同,!号表示相反的意思;
- -z:字符串内容为空。
示例:
[root@localhost ~]# echo $LANG
zh.CN.UTE-8
[root@localhost~ ]# [ $LANG !="en.US"] && echo "Not en.uS" //测试当前语言环境
Not en.uS
[root@localhost~ ]# read -p “是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@localhost~ ]# [ $ACK="yes" ] && echo “覆盖” //测试读入的字符串是否为yes
覆盖
1.4 逻辑测试
逻辑测试值的是判断两个或多个条件之间的依赖关系。
命令格式:
[ 表达式1 ] 操作符 [ 表达式2 ] ...
命令1 操作符 命令2 ...
常用的测试操作符:
- -a或&&:逻辑与,“而且”的意思;
- -o或||:逻辑或,“或者”的意思;
- !:逻辑否;
示例:
[root@localhost~ ]# [-d /etc ] && [ -r /etc ] && echo "You can open it"
[root@localhost~ ]# [-d /etc ] || [ -d /home ] && echo "ok“
2.if语句的介绍
在shell脚本应用中,if语句是最为常见的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作。
2.1 单分支if语句
- if语句的分支指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在条件成立时才会执行代码,否则不会执行任何操作。
单分支结构:
if 条件测试操作
then 命令序列
fi
单分支if语句应用:
很多Linux用户习惯上将光盘设备挂载到/media/cdrom目录下,但CentOS 7系统默认并没有建立此目录。若需要在Sheli脚本中执行挂载光盘的操作,建议先判断挂载点目录是否存在,若不存在则新建此目录。
[root@localhost ~]# vim chkmountdir. sh
#!/bin/bash
MOUNT_DIR="/media/cdrom"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
[root@localhost ~]# chmod +x chkmountdir.sh
[root@localhost ~]# ./chkmountdir. sh
2.2 双分支if语句
- 双分支if 语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是“坐视不管”地不执行任何操作
双分支结构:
if 条件测试操作
then 命令序列1
else 命令序列2
fi
双分支if 语句应用:
- 例如,若要编写一个连通性测试脚本 pinghost.sh,通过位置参数$1提供自标主机地址,然后根据ping检测结果给出相应的提示,可以参考以下操作过程。
[root@localhost~]# vim pinghost.sh
#! /bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if[ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
fi
[root@localhost ~]# chmod +x pinghost.sh
[root@localhost ~]# ./pinghost.sh
脚本解释:在上述脚本代码中,为了提高ping命令的测试效率,使用了“-c” “-i” “-w” 选项,分别指定只发送三个测试包、间隔0.2秒、超时3秒。另外,通过“&>/dev/null”屏蔽了ping 命令执行过程的输出信息,执行pinghost.sh。
2.3 多分支if语句
- 由于if语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。
多分支if语句结构:
if 条件测试操作1
then 命令序列1
elif 命条件测试操作2
then 命令序列2
else
命令序列3
fi
多分支if 语句应用:
例如,对成绩进行判断,85 ~ 100为优秀,70 ~ 84为良好,60 ~ 69为合格,60以下不合格,则
[root@localhost~]# vim chengji.sh
#!/bin/ bash
#成绩判断
read -p"您的成绩为:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]
then echo"输入错误,请重新输入0-100间数值"
elif [ $grade -ge 85 ] && [ $grade -le 100 ]
then echo“优秀!!!“
elif [ $grade -ge 60 ] && [ $grade -le 69 ]
then echo "合格!!!"
else echo "不合格!!!"
fi
扩展:
case语句结构
case语句主要适用于以下情况:
- 某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。
case分支语法结如下:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默认命令序列
esac
使用case分支语句的注意事项:
- case行尾必须为单词"in",每一模式必须以右括号" ) "结束;
- 双分号" ;; "表示命令序列的结束;
- 模式字符串中可以用方括号表示一个连续的范围,如"[0-9]";还可以用竖杠符号" | "表示或,如 “A|B”;
- 最后的" *) "表示默认模式,其中的 * 相当于通配符。