if语句结构及用法,条件测试的相关介绍

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”;
  • 最后的" *) "表示默认模式,其中的 * 相当于通配符。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值