shell编程之条件语句

本文详细介绍了Shell编程中的条件测试操作,包括test命令的使用、整数数值的比较、字符串比较、逻辑测试(短路运算)以及if语句和case结构的运用。通过实例展示了如何在Shell脚本中进行条件判断,如文件属性测试、数值比较和逻辑运算,为Shell编程提供了基础指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、条件测试操作

1、test命令

测试表达式是否成立,若成立返回0,否则返回其他数值

格式1: test 条件表达式

格式2:[ 条件表达式 ]      注:中括号内至少应有一个空格

操作符:

-d:测试是否为目录(Directory)

-e:测试目录或文件是否存在(Exist)

-a:测试目录或文件是否存在(Exist)

-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(eXcute)

-L: 测试是否为软连接文件

属性测试补充:

-s FILE #是否存在且非空

-t fd #fd 文件描述符是否在某终端已经打开

-N FILE #文件自从上一次被读取之后是否被修改过

-O FILE #当前有效用户是否为文件属主

-G FILE #当前有效用户是否为文件属组

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

测试过程,实现评估布尔声明,以便用在条件性环境下进行执行

若真,则状态码变量 $? 返回0

若假,则状态码变量 $? 返回1

条件测试命令

2、比较整数数值

[  整数1  操作符  整数2  ] 公式

-eq:第一个数等于(Equal)第二个数

-ne:第一个数不等于(Not Equal)第二个数

-gt:第一个数大于(Greater Than)第二个数

-lt:第一个数小于(Lesser Than)第二个数

-le:第一个数小于或等于(Lesser or Equal)第二个数

-ge:第一个数大于或等于(Greater or Equal)第二个数

3、字符串比较

常用的测试操作符

 =:字符串内容相同

!=:字符串内容不同,! 号表示相反的意思

-z:字符串内容为空

-n: 字符是否存在

格式

[  字符串1  =  字符串2 ]  是否相同

[  字符串1  !=  字符串2 ]  是否不相同

[  -z  字符串 ]   是否为空

[  -n  字符串 ] 字符是否存在

4、逻辑测试(短路运算)

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ... 格式2:命令1 操作符 命令2 ...

常见条件

-a或&&:逻辑与,“而且”的意思全真才为真

-o或||:逻辑或,“或者”的意思一真即为真

!:逻辑否

(1)短路与 &&

CMD1 短路与 CMD2

全真才为真

第一个CMD1结果为真 ,第二个CMD2必须要参与运算,才能得到最终的结果

第一个CMD1结果为假 ,总的结果必定为假,因此不需要执行CMD2

(2)短路或 ||

CMD1 短路或 CMD2

一真即为真

第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2

第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

[root@192 ~]# uname -r
3.10.0-693.el7.x86_64
[root@192 ~]# uname -r |awk -F. '{print $1}'
3
[root@192 ~]# uname -r |awk -F. '{print $2}'
10
[root@192 ~]# MAIN=$(uname -r |awk -F. '{print $2}')
[root@192 ~]# SAIN=$(uname -r |awk -F. '{print $1}')
[root@192 ~]# [ $SAIN -ge 3 ]&& [ $MAIN -ge 4 ]&& echo "yes"
yes
[root@192 ~]# [ ! -d mmm ] && echo "yes"
yes

[root@localhost etc]# [ 4 -lt 5 ]&&echo true || echo false
true
[root@localhost etc]# [ 4 -gt 5 ]&&echo true || echo false
false
[root@localhost etc]# [ 4 -gt 5 ]&& echo true ||echo false
false

|| 只有前面不成立时才会执行后面的操作

合并条件
[root@localhost etc]# [ $a -ne 1 ]&&[ $a != 2 ]
[root@localhost etc]# echo $?
0
[root@localhost etc]# [ $a -ne 1 -a  $a != 2 ]
[root@localhost etc]# echo $?
0
[root@localhost etc]# [[ $a -ne 1 &&  $a != 2 ]]
[root@localhost etc]# echo $?
0

ping 小脚本
-c 发送包的个数
-i 发送的间隔时间
-W 超时时间
-w 多少秒后停止ping操作
#!/bin/bash
ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 online" || echo "$1 off"



[root@localhost opt]# df -h |grep "/dev/sd" |awk -F "[  %]+" '{print $5}'
4
[root@localhost opt]# df -h |grep "/dev/sd" |awk '{print $5}'
4%
[root@localhost opt]# df -h |grep "/dev/sd" |awk '{print $5}'|awk -F % '{print $1}'
4
[root@localhost opt]# use=$(df -h |grep "/dev/sd" |awk '{print $5}'|awk -F % '{print $1}')
[root@localhost opt]# echo $use 
4
[root@localhost opt]# [ $use -gt 80 ] && echo "磁盘占用太多了" || echo "目前磁盘使用较少"

5、if语句的结构

5.1分支结构

单分支

if 判断条件;

then   条件为真的分支代码

fi

双分支

if 判断条件; then
 条件为真的分支代码

else
 条件为假的分支代码

fi

多分支

if 判断条件1; then
 条件1为真的分支代码

elif 判断条件2; then
 条件2为真的分支代码

elif 判断条件3; then
 条件3为真的分支代码

...
else
 以上条件都为假的分支代码

fi

例一、判断是否为超级管理员

#!/bin/bash
if [ "$USER" != "root" ]
then
        echo "非管理员用户无权限操作"
else
echo "是管理员用户"
fi
        

例二、判断是主机连通性

#!/bin/bash
ping -c 3 192.168.91.1
if
        [ $? = 0 ]
then
        echo "与真机网络通顺"
        exit 1
fi
        echo "与真机网络不通"

例三、多分支

#!/bin/bash
read -p "请输入你的考试分数:" grade

if [ $grade -ge 85 ]&& [ $grade -le 100 ]
then
echo "你的成绩为$grade"
echo "你的成绩为优秀"

elif [ $grade -ge 70 ]&&[ $grade -le 84 ]
then
echo "你的成绩为$grade"
echo "你的成绩为良好"
elif
[ $grade -ge 60 ]&&[ $grade -le 69 ]
then
echo "你的成绩为$grade"
echo "你的成绩为合格" 
else
echo "你的成绩为$grade"
echo "你的成绩不合格"
fi

6、case

格式:

case 变量引用 in
PAT1)
 分支1
 ;;
PAT2)
 分支2
 ;;
...
*)
 默认分支
 ;;
esac

注:case支持glob风格的通配符:

* 任意长度任意字符

? 任意单个字符

[] 指定范围内的任意单个字符

|   或者,如: a|b

例:

echo -n   表示不换行输出

echo -e   表示输出转义符

常用的转义符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值