shell脚本的条件语句及if循环
shell脚本的条件语句及if循环
shell条件语句
条件测试操作
⽂件测试
要使shell脚本程序具备⼀定的"智能",⾯临的第⼀个问题就是如何区分不同的情况以确定执⾏何种操作。例如,当磁盘使⽤率超过95%时,发送告警信息;当备份⽬录不存在时,能够⾃动创建;当源码编译程序时,若配置失败则不再继续安装。
shell环境根据命令执⾏后的返回状态值($?)来判断是否执⾏成功,当返回值为0时表⽰成功,否则(⾮0值)表⽰失败或异常。使⽤专门的测试⼯具—test
命令,可以对特定条件进⾏测试,并根据返回值来判断条件是否成⽴(返回值为0表⽰条件成⽴)。
语法格式
格式1 test 条件表达式
格式2 [ 条件表达式 ]
#注意中括号和表达式中间需要隔⼀个空格
或 [[ 条件表达式 ]]
⽂件测试指的是根据给定的路径名称,判断对应的是⽂件还是⽬录,或者判断⽂件是否可读、可写、可执⾏等。⽂件测试的常见操作选项如下,使⽤时将测试对象放在操作选项之后即可。
-d:测试是否为⽬录( Directory ) 。
-e:测试⽬录或⽂件是否存在(Exist) 。
-f:测试是否为⽂件(File ) 。
-r:测试当前⽤户是否有权限读取(Read) 。
-w:测试当前⽤户是否有权|限写⼊(write ) 。
-x:测试是否设置有可执⾏(Excute)权限。
-b:测试是否为设备⽂件
-c:测试是否为字符设备⽂件
-s:测试存在且⽂件⼤⼩为空
-L:测试是否为链接⽂件
执⾏条件测试操作以后,通过预定义变量? 可 以 获 得 测 试 命 令 的 返 回 状 态 值 , 从 ⽽ 判 断 该 条 件 是 否 成 ⽴ 。 例 如 , 执 ⾏以 下 操 作 可 测 试 ⽬ 录 / m e d i a / 是 否 存 在 , 如 果 返 回 值 ?可以获得测试命令的返回状态值,从⽽判断该条件是否成⽴。例如,执⾏以下操作可测试⽬录/media/是否存在,如果返回值?可以获得测试命令的返回状态值,从⽽判断该条件是否成⽴。例如,执⾏以下操作可测试⽬录/media/是否存在,如果返回值?为 0,表⽰存在此⽬录,否则表⽰不存在或者虽然存在但不是⽬录
test -d /etc/sysconfig/test
test -f /etc/sysconfig/test
test -e /etc/sysconfig
[-f /home/zxf/]
[-d /home/zxf/] && echo"yes"
[!-e /opt]
整数值⽐较
整数值⽐较指的是根据给定的两个整数值,判断第⼀个数与第⼆个数的关系,如是否⼤于、等于、⼩于第⼆个数。整数值⽐较的常⽤操作选项如下,使⽤时将操作选项放在要⽐较的两个整数之间。
常⽤测试操作符
-eq:第⼀个数等于(Equal)第⼆个数。
-ne:第⼀个数不等于(Not Equal)第⼆个数。
-gt:第⼀个数⼤于( Greater Than)第⼆个数。
-lt:第⼀个数⼩于(Lesser Than)第⼆个数。
-le:第⼀个数⼩于或等于(Lesser or Equal)第⼆个数。
linux循环执行命令脚本
-ge:第⼀个数⼤于或等于( Greater or Equal)第⼆个数
who |wc-l
[ $ (who | wc -l )-le 5 ] && echo""
[ $ (who | wc -l )-ge 10 ] && echo""
FreeCC=$ (free - m | grep "Men:"| awk '{print $6}')
[ $ Freecc -lt 4096 ] && echo ${Freecc }MB
men_size=$ (free -m |grep "Men: "| awk ' {print $4 }')
[ $ men_size -le 1024 ] && echo""
字符串⽐较
字符串⽐较通常⽤来检查⽤户输⼊、系统环境等是否满⾜条件,在提供交互式操作的she1l脚本中,也可⽤来判断⽤户输⼊的位置参数是否符合要求。字符串⽐较的常⽤操作选项如下。
=:第⼀个字符串与第⼆个字符串相同。
!=:第⼀个字符串与第⼆个字符串不相同,其中"!"符号表⽰取反。
-z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。
echo $ LAN
Gzh_CN.UTF-8
[ $ LANG != "en.us"] && echo"Not en.us"
read -p "是否覆覆盖现有⽂件( yes/ no)?"ACK
是否覆覆盖现有⽂件( yes/ no)?yes
[ $ ACK = "yes"] && echo"覆盖"
逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成⽴或者只要有其中⼀个成⽴等情况,需要有⼀个测试的过程。
常⽤的逻辑测试操作如下,使⽤时放在不同的测试语句或命令之间。
&&:逻辑与,表⽰"⽽且",只有当前后两个条件都成⽴时,整个测试命令的返回值﹑才为0(结果成⽴)。使⽤test命令测试时,"&&“可改为”-a"。
||:逻辑或,表⽰"或者",只要前后两个条件中有⼀个成⽴,整个测试命令的返回值即为0(结果成⽴)。使⽤test命令测试时,"||“可改为”-o”。
!:逻辑否,表⽰"不",只有当指定的条件不成⽴时,整个测试命令的返回值才为0(结果成⽴)。
[-d /etc ] && [-r /etc ] && echo"你可以打开"
[-d /etc ]||[-d /home ] && echo"OK"
在上述逻辑测试的操作选项中,"& &“和”||“通常也⽤于间隔不同的命令操作,其作⽤是相似的。实际上此前已经接触过”&&"操作的应⽤,如"make && make install"的编译安装操作。
例如,若要判断当前Linux系统的内核版本是否⼤于 3.4,可以执⾏以下操作。其中,内核版本号通过uname和lawk命令获得
uname -r/查看内核版本信息
3.10.0-51
4.el7.x8664
Mnum=$ (uname -r | awk -F.'{print $1} ')//取主版本号
Snum=$ (uname -r | awk  -F.'{print $2} ')//取次版本号
[ $ Mnum -ge 3 ]  && [ $ Snum -gt 4 ] && echo"符合要求"
if语句的结构
单分⽀if语句
实际上使⽤"&&”和"||"逻辑测试已经可以完成简单的判断并执⾏相应的操作,但是当需要选择执⾏的命令语句较多时,这种⽅式将使执⾏代码显得很复杂,不好理解。⽽使⽤专⽤的 if条件语句,可以更好地整理脚本结构,使得层次分明,清晰易懂。
单分⽀if
语句:对于单分⽀的选择结构,只有在"条件成⽴"时才会执⾏相应的代码,否则不执⾏任何操作。
语法格式:
1)
if条件测试操作
then
命令序列
fi#注意后⾯有个结尾,开头结尾要凑成⼀对否则会报语法错误
2 )
if条件测试操作; then
命令序列
fi
if[3 -gt 2];then
echo"ok"
fi
[ 3 -gt 2]  && echo"ok"
例1
判断⽬录是否存在
#!/bin/bash
if ls/mnt
then
echo"it's ok"
fi
例2
判断挂载点,如果不存在就⾃动创建
#!/ bin/ bash
MOUNT_DIR="/media/ cdrom/ "
if[!-d $MOUNT_DIR]
then
mkdir -p $MOUNT_DIF
fi
例3
判断输⼊结尾是否.sh
#!/bin/bash
read -p "请输⼊⽂件名:" file
if[[$file == *.sh ]];then
echo"这是⼀个shell脚本"
fi
双分⽀if语句
双分⽀ if 语句只是在单分⽀的基础上针对"条件不成⽴"的情况执⾏另⼀种操作,⽽不是"坐视不管"地不执⾏任何操作例1判断⽬标主机是否存活,存活就打印is up,如果不存活就打印is down
-c ping的次数
-i 每次多久ping⼀次,单位是秒
-w 反馈结果的时间,如果不通时可加快反馈时间,单位是秒
#!/bin/bash
ip=192.168.49.13
ping -c 2 -i 0.2 -w 3 $ ip &> / dev/ null
if[ $? -eq 0 ];then
echo"$ip is up "
else
echo"$ip is down"
fi
判断以.sh结尾的脚本是⼀个shell脚本(双⽅括号⽤法:可以模式匹配)
[ abc == abc ]
[[ abc == abc* ]]
例2.判断输⼊的⽤户名是否存在,存在提⽰已存在,不存在则创建⽤户并设置密码
#!/bin/bash
read -p "请输⼊你要创建的⽤户名:" name
id $name &> / dev/null
if[$ ? -eq 0 ];then
echo"该⽤户已存在!"
else
useradd $name
echo"123"| passwd --stdin $name &> /dev/null
echo"已创建⽤户$name,并设置密码"
例3.判断当前登陆⽤户是否是管理员
#!/bin/bash
if[$UID-eq 0 ];then
echo"当前登陆⽤户是管理员root"
else
echo"当前登陆⽤户不是管理员"
fi
例4
#!/bin/ bash
read -p "检查⽬录是否存在,请输⼊⽬录:"  aaa
if ls$aaa &> / dev/null
then
echo"⽬录存在"else
echo"请输⼊正确路径"
fi
例5
#!/ bin/ bash
netstat -natup l grep ":80"&>/ dev / nullif [ $?-eq 0];then
echo"⽹站服务已经运⾏!"else
echo"启动httpd服务"
yum install -y httpd >/ dev/ nullsystemctl start httpd
fi
多分⽀if语句
与单分⽀、双分⽀if 语句相⽐,多分⽀ if 语句的结构能够根据多个互斥的条件分别执⾏不同的操作案例:例1.根据输⼊的考试分数不同来区分优秀、合格、不合格三挡
#!/bin/ bash
read -p "请输⼊您的分数(0-100) : " GRADE
if[$GRADE-ge 85 ] && [$GRADE-le 100 ]
then
echo"$GRADE分,优秀!"
elif [$GRADE-ge 70 ] & & [$GRADE-le 84 ]
then
echo"$GRADE分,合格!"
else
echo"$GRADE分,不合格!"
fi
例2.判断⽂件类别
#!/bin/bash
read -p "输⼊要识别的⽂件" name
if[-d $name];then
echo"这是⼀个⽬录"
elif [-f $name];then
echo"这是⼀个⽂件"
elif [-b $name];then
echo"这是⼀个设备⽂件"
else
echo"⽆法判断⽂件类别"
fi
嵌套if语句
例1.判断httpd服务有没有启动
判断是否启动
如果启动------输出已启动
如果没启动----判断是否安装—如果安装—启动
如果没安装----安装—如果安装成功—启动
如果安装不成功—报错

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。