理论 : shell编程之条件语句————理论讲解
发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,前言:条件语句也是流程控制语句,日常生活逻辑条件测试文件测试整数测试字符串与逻辑测试if语句if单分支语句if双分支语句if多分支语句一 :条件测试操作1.1.1 test命令测试特定的表达式是否成立
千家信息网最后更新 2024年11月29日理论 : shell编程之条件语句————理论讲解
前言:
条件语句也是流程控制语句,日常生活逻辑
条件测试
- 文件测试
- 整数测试
- 字符串与逻辑测试
if语句
- if单分支语句
- if双分支语句
- if多分支语句
一 :条件测试操作
1.1.1 test命令
- 测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
'格式1:test 条件表达式'格式2:[ 条件表达式 ]
在格式2中,前后至少有一个空格
1.1.2 文件测试 文件类型和权限测试
[ 操作符 文件或目录 ]
1.1.3 常用的测试操作符
- -e :测试目录或文件是否存在(Exist)
- -d :测试是否为目录(Directory)
- -f :测试是否为文件(File)
- -r :测试当前用户是否有权限读取(Read)
- -w :测试当前用户是否有权限写入(Write)
- -x :测试当前用户是否有权限执行(eXcute)
[root@localhost opt]# touch test.txt[root@localhost opt]# mkdir abc[root@localhost opt]# lsabc rh test.txt wwwroot[root@localhost opt]# test -d /opt/abc/[root@localhost opt]# echo $?0[root@localhost opt]# [ -d /opt/abc ][root@localhost opt]# echo $?0[root@localhost opt]# test -f /opt/abc[root@localhost opt]# echo $?1[root@localhost opt]# test -f /opt/test.txt [root@localhost opt]# echo $?0[root@localhost opt]# test -f /opt/te.txt[root@localhost opt]# echo $?1[root@localhost opt]# [ -x /opt/abc]bash: [: 缺少 `]'[root@localhost opt]# [ -x /opt/abc ][root@localhost opt]# ls -al总用量 16drwxr-xr-x. 5 root root 156 11月 26 13:51 .dr-xr-xr-x. 17 root root 224 10月 23 13:41 ..'drwxr-xr-x. 2 root root 6 11月 26 13:51 abcdrwxr-xr-x. 2 root root 6 3月 26 2015 rh-rw-r--r--. 1 root root 0 11月 26 13:51 test.txt[gsy@localhost opt]$ [ -w /opt/abc ][gsy@localhost opt]$ echo $?1[gsy@localhost opt]$ [ -w /opt/abc ]&&echo "yes"[gsy@localhost opt]$ echo $?1[gsy@localhost opt]$ [ -r /opt/abc ]&&echo "yes"yes[gsy@localhost opt]$ echo $?0[gsy@localhost opt]$
echo $? 查询上个步骤是否成立,成立则为0,不成立则为非0值
[gsy@localhost opt]$ [ -w /opt/abc ]&&echo "yes"
&& 是而且的含义 表示如果两边的条件都成立,才会正确执行;echo "yes"很明显是正确的,即若是[ -w /opt/abc ]成立,则会输出yes,若是不成立,则不会输出yes,这种操作可以变相地来验证操作是否成立
|| 或的含义,只要有一个成立,整体就算对;第一个对的话,就不会在去查看下面操作
[root@localhost opt]# [ -d /opt/abc ]|| echo "year"[root@localhost opt]# echo $?0[root@localhost opt]# [ -d /opt/ab ]|| echo "year"year[root@localhost opt]# echo $?0[root@localhost opt]# [ -d /opt/abc ]|| echo "year"[root@localhost opt]# echo $?0
1.2.1 整数值比较
[ 整数1 操作符 整数2 ]
1.2.2 常用的测试操作符
- -eq :等于(Equal)
- -ne :不等于(Not Equal)
- -gt :大于(Greater Than)
- -lt :小于(Lesser Than)
- -le :小于或等于(Lesser or Equal)
- -ge :大于或等于(Greater or Equal)
[root@localhost opt]# [ 5 -gt 3 ]&& echo "yes"yes[root@localhost opt]# [ 5 > 3 ]&& echo "yes"yes[root@localhost opt]# [ 5 < 3 ]&& echo "yes"yes[root@localhost opt]# [ 5 \< 3 ]&& echo "yes"[root@localhost opt]# echo $?1[root@localhost opt]# [ 5 \= 3 ]&& echo "yes"[root@localhost opt]# [ 5 \> 3 ]&& echo "yes"yes[root@localhost opt]# [ 3 \= 3 ]&& echo "yes"yes[root@localhost opt]# [ 3 == 3 ]&& echo "yes"yes[root@localhost opt]# [ 3 != 3 ]&& echo "yes"[root@localhost opt]# echo $?1[root@localhost opt]# [ 3 != 4 ]&& echo "yes"yes[root@localhost opt]# [ 3 >= 3 ]&& echo "yes"bash: [: 3: 期待一元表达式[root@localhost opt]# [ 3 => 3 ]&& echo "yes"bash: [: 3: 期待一元表达式[root@localhost opt]# [ 3 \>= 3 ]&& echo "yes"bash: [: >=: 期待二元表达式[root@localhost opt]#
[root@localhost opt]# whoroot :0 2019-11-26 08:16 (:0)root pts/0 2019-11-26 08:16 (:0)[root@localhost opt]# [root@localhost opt]# who |wc -l2[root@localhost opt]# [ $(who |wc -l) -lt 5 ]&& echo "too less"too less[root@localhost opt]# [ $(who |wc -l) -ge 2 ]&& echo ">=2">=2
$()里面接命令 作用相当于··反撇符号
[root@localhost opt]# free -m total used free shared buff/cache availableMem: 1984 686 81 9 1216 1060Swap: 2047 0 2047[root@localhost opt]# free -m | grep MemMem: 1984 686 81 9 1216 1060[root@localhost opt]# free -m | grep Mem | awk '{print $1,$3,$4}'Mem: 686 81[root@localhost opt]# free -m | grep Mem | awk '{print $4}'79[root@localhost opt]# abc=$(free -m | grep Mem |awk '{ print $4 }')[root@localhost opt]# echo abcabc[root@localhost opt]# echo $abc77[root@localhost opt]# [ $abc -gt 1024 ]&& echo "yes"[root@localhost opt]# [ $abc -gt 50 ]&& echo "yes"yes
1.3.1 字符串比较
格式1:
[ 字符串1 = 字符串2 ][ 字符串1 != 字符串2 ]
格式2:
[ -z 字符串 ]
1.3.2 常用的测试操作符
- = :字符串内容相同
- != :字符串内容不同,!表示相反的意思
- -z : 字符串内容为空
- 字符串需要用双引号标出来
1.3.3 演示
[root@localhost opt]# echo $LANGzh_CN.UTF-8[root@localhost opt]# [ $LANG = "zh_CN.UTF-8" ]&& echo "yes"yes[root@localhost opt]# [ $LANG != "zh_CN.UTF-8" ]&& echo "yes"[root@localhost opt]# echo $?1
[root@localhost opt]# [ "男" != "男" ]&& echo "yes"[root@localhost opt]# [ "男" = "男" ]&& echo "yes"yes[root@localhost opt]# [ "男" = "女" ]&& echo "yes"[root@localhost opt]# [ "男" != "女" ]&& echo "yes"yes
中括号内为测试语句,可以进行比较
是否创建/opt/share目录:(yes/no) 创建成功
已经存在
[root@localhost opt]# ls -al总用量 16drwxr-xr-x. 5 root root 156 11月 26 13:51 .dr-xr-xr-x. 17 root root 224 10月 23 13:41 ..'drwxr-xr-x. 2 root root 6 11月 26 13:51 abcdrwxr-xr-x. 2 root root 6 3月 26 2015 rh-rw-r--r--. 1 root root 0 11月 26 13:51 test.txt[root@localhost opt]# mv test.txt test.sh[root@localhost opt]# vim test.sh #!/bin/bashread -p "是否创建/opt/share目录:(yes/no)" ack[ $ack = "yes" ]&& mkdir /opt/shareecho "创建成功"[root@localhost opt]# sh test.sh 是否创建/opt/share目录:(yes/no)yes创建成功[root@localhost opt]# lsabc share test.sh rh [root@localhost opt]# vim test.sh #!/bin/bashread -p "是否创建/opt/demo目录:(yes/no)" ack[ -d /opt/demo ]&&echo "/opt/demo已经存在" || mkdir /opt/demo && echo "/opt/demo创建成功"[root@localhost opt]# sh test.sh 是否创建/opt/demo目录:(yes/no)yes/opt/demo创建成功[root@localhost opt]# sh test.sh 是否创建/opt/demo目录:(yes/no)yes/opt/demo已经存在/opt/demo创建成功
一元运算符:
i=1;
i=i++ 等同于i=$i+1 ,代表先赋值,再加加,即并没有重新赋值
i=++i 先加再赋值 ,把得到的结果再去赋值,此时的加加就有了意义
[root@localhost opt]# i=1[root@localhost opt]# echo $i1[root@localhost opt]# i++bash: i++: 未找到命令...[root@localhost opt]# i++;bash: i++: 未找到命令...[root@localhost opt]# expr i++i++[root@localhost opt]# let i++[root@localhost opt]# echo $i2[root@localhost opt]# let i=i++[root@localhost opt]# echo $i2[root@localhost opt]# let i++[root@localhost opt]# echo $i3[root@localhost opt]# let ++i[root@localhost opt]# echo $i4[root@localhost opt]# let i=++i[root@localhost opt]# echo $i5[root@localhost opt]# let i=i++[root@localhost opt]# echo $i5[root@localhost opt]# let i=++i[root@localhost opt]# echo $i6[root@localhost opt]# let i=i+bash: let: i=i+: 语法错误: 期待操作数 (错误符号是 "+")[root@localhost opt]# let i=i++[root@localhost opt]# echo $i6[root@localhost opt]# let i+=2[root@localhost opt]# echo $i8[root@localhost opt]# [root@localhost opt]# i\*=2bash: i*=2: 未找到命令...[root@localhost opt]# let i\*=2[root@localhost opt]# echo $i16[root@localhost opt]# let i/=2[root@localhost opt]# echo $i8[root@localhost opt]# let i%=2[root@localhost opt]# echo $i0[root@localhost opt]# echo $i0[root@localhost opt]#
二元运算符
a+b=c
三元运算符
条件&&结果1||结果2
条件成立执行结果1,不成立执行结果2
1.4.1 逻辑测试
格式1:
[ 表达式1 ] 操作符 [ 表达式2 ] ···
格式2:
命令1 操作符 命令2 ·······
1.4.2 常用的测试操作符
- -a或&& :逻辑与,"而且"的意思
- -o或|| :逻辑或,"或者"的意思
- ! :逻辑否,代表取反含义
[root@localhost opt]# [ -d /etc ]&& [ -r /etc ]&&echo "you can open /etc this diretory"you can open /etc this diretory[root@localhost opt]# [ -d /etc ]|| [ -d /home ]&& echo "ok"ok[root@localhost opt]# [ -r /etc ]|| [ -d /home ]&& echo "ok"ok[root@localhost opt]# [ -r /etc ]|| [ -r /home ]&& echo "ok"ok[root@localhost opt]# [ -f /etc ]|| [ -f /home ]&& echo "ok"[root@localhost opt]# echo $?1[root@localhost opt]# [ ! -f /etc ]|| [ -f /home ]&& echo "ok"ok
二 : if语句的结构
2.1 单分支结构
fi结束判断,exit 0正常退出,exit 1异常退出
2.2 双分支结构
2.3 多分支结构
三 : if语句应用实例
3.1 单分支if语句
- 判断挂载点目录,若不存在则自动创建
[root@localhost opt]# vim test02.sh#!/bin/bashdir="/opt/demo02"if [ ! -d $dir ]thenmkdir -p $direcho "$dir创建成功"fi[root@localhost opt]# sh test02.sh /opt/demo02创建成功[root@localhost opt]# ls[root@localhost opt]# lsabc share test.sh rh demo02 [root@localhost opt]# vim test02.sh#!/bin/bashdir="/opt/demo02"if [ ! -d $dir ]thenmkdir -p $direcho "$dir创建成功"elseecho "$dir已存在"fi[root@localhost opt]# sh test02.sh /opt/demo02已存在
## 3.2 双分支if语句- 判断目标主机是否存活,显示检测结果- ping -c 发送包个数 -i 间隔时间,单位s,-W 等待3s $1 位置变量ip地址,把结果混合输出到null中 上一条结果若是等于0,成立,则输出up,else就会down![](https://s1.51cto.com/images/blog/201911/26/a02e04631aec4534762c49c2f54bbe34.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)请输入IP地址:```shell[root@localhost opt]# vim test02.sh#!/bin/bashread -p "请输入IP地址:" addrping -c 3 -i 0.2 -W 3 $addr &> /dev/nullif [ $? -eq 0 ] then echo "$addr is up" else echo "$addr is down"fi[root@localhost opt]# sh test02.sh 请输入IP地址:192.168.139.132192.168.139.132 is up[root@localhost opt]# sh test02.sh 请输入IP地址:139.168.139.133139.168.139.133 is down[root@localhost opt]#
3.3 多分支语句
elif 否则 如果
exit 1 异常退出
[root@localhost opt]# vim fenshu.sh#!/bin/bashread -p "请输入您的分数" scoreif [ $score -lt 0 ] then echo "你已经没救了"elif [ $score -gt 100 ] then echo "别做梦"elif [ $score -ge 85 ] then echo "成绩优秀"elif [ $score -lt 70 ] then echo "不及格,还要好好努力啊少年"else echo "成绩合格,不要就此止步,继续努力!"fi~ [root@localhost opt]# sh fenshu.sh 请输入您的分数-9你已经没救了[root@localhost opt]# sh fenshu.sh 请输入您的分数101别做梦[root@localhost opt]# sh fenshu.sh 请输入您的分数90成绩优秀[root@localhost opt]# sh fenshu.sh 请输入您的分数60不及格,还要好好努力啊少年
总结:
- 条件测试操作的语法
- 文件测试、整数值比较、字符串比较、逻辑测试
- 图示if条件语句的语法
- 单分支、双分支、多分支
一个简易的计算器
#!/bin/bashread -p "请输入一个整数:" numb1read -p "请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)" yunsuanread -p "请输入第二个整数:" numb2if [ "$yunsuan" = "+" ] then expr=`expr $numb1 + $numb2` echo "$numb1 + $numb2 = $expr"elif [ "$yunsuan" = "-" ] then expr=`expr $numb1 - $numb2` echo "$numb1 - $numb2 = $expr"elif [ "$yunsuan" = "x" ] then expr=`expr $numb1 \* $numb2` echo "$numb1 x $numb2 = $expr"elif [ "$yunsuan" = "/" ] then expr=`expr $numb1 / $numb2` echo "$numb1 / $numb2 = $expr"else expr=`expr $numb1 % $numb2` echo "$numb1 % $numb2 = $expr" fi~ ~ [root@localhost opt]# sh jisuanqi.sh 请输入一个整数:10请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)+请输入第二个整数:810 + 8 = 18[root@localhost opt]# vim jisuanqi.sh[root@localhost opt]# sh jisuanqi.sh 请输入一个整数:10请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)-请输入第二个整数:510 - 5 = 5[root@localhost opt]# sh jisuanqi.sh 请输入一个整数:10请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)x请输入第二个整数:2[root@localhost opt]# sh jisuanqi.sh 请输入一个整数:17请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)%请输入第二个整数:417 % 4 = 1[root@localhost opt]# sh jisuanqi.sh 请输入一个整数:10请选择你需要的运算;选项:加(+)减(-)乘(x)除(/)取余 (%)/请输入第二个整数:510 / 5 = 2
作业:田径赛决赛名单 淘汰名单 姓名 性别 成绩
[root@localhost opt]# vim tianjingsai.sh 1 #!/bin/bash 2 fnan=/opt/nanzizujuesaimingdan 3 fnv=/opt/nvzizujuesaimingdan 4 ftao=/opt/taotaimingdan 5 if [ ! -f $fnan ]&& [ ! -f $fnv ]&& [ ! -f $ftao ] 6 then 7 touch $fnan $fnv $tao 8 fi 9 read -p "请输入(格式:姓名 性别 成绩):" xingming xingbie chengji 10 if [ $chengji -lt 0 ] 11 then 12 echo "???你在输什么??" 13 exit 1 14 elif [ $chengji -gt 0 ] && [ $chengji -lt 10 ] 15 then 16 echo "你的成绩优秀,可以进入10秒内决赛" 17 if [ $xingbie = "nan" ] 18 then 19 echo "$xingming $xingbie $chengji" >> /opt/nanzizujuesaimingdan 20 else 21 echo "$xingming $xingbie $chengji" >> /opt/nvzizujuesaimingdan 22 fi 23 else 24 echo "$xingming $xingbie $chengji" >> /opt/taotaimingdan 25 echo "再加把劲,下次就是你了" 26 27 fi~ [root@localhost opt]# sh tianjingsai.sh 请输入(格式:姓名 性别 成绩):gsy nan 1你的成绩优秀,可以进入10秒内决赛[root@localhost opt]# sh tianjingsai.sh 请输入(格式:姓名 性别 成绩):zzz nv 6你的成绩优秀,可以进入10秒内决赛[root@localhost opt]# sh tianjingsai.sh 请输入(格式:姓名 性别 成绩):aaa nan -6???你在输什么??[root@localhost opt]# sh tianjingsai.sh 请输入(格式:姓名 性别 成绩):aaa nan 14再加把劲,下次就是你了[root@localhost opt]# lsfenshu.sh nvzizujuesaimingdan taotaimingdan test.sh wwwrootnanzizujuesaimingdan rh test02.sh tianjingsai.sh[root@localhost opt]# cat nvzizujuesaimingdan zzz nv 6[root@localhost opt]# cat nanzizujuesaimingdan gsy nan 1[root@localhost opt]# cat taotaimingdan gsy nan 0.5aaa nan 14
输入
测试
整数
语句
分支
成绩
格式
条件
字符
字符串
目录
成功
运算
操作符
结果
表达式
命令
文件
逻辑
姓名
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
sql 如何建数据库
医院的网络安全吗
厨房互联网科技
c dat能存多大数据库
数据库大量数据处理
实效开展网络安全宣传周活动
弥勒市公安局网络安全大队
阿里巴巴物联网网络安全防护
服务器做存储
湖南云师互联网络科技有限公司
剑灵五区服务器
数据库批量改表名
云服务器的网络流量包是啥
气候变化科研数据库
网络安全周鸿祎张春雨
关于信息网络安全手抄报
阿里服务器 网速
人民医院网络安全建设方案
2018数据库软件市场
线上培训软件开发背景
EI软件开发人员
东阳高景网络技术有限公司
像素类游戏是什么软件开发的
xml如何作为数据库使用
计算机网络安全及应用
网络安全隐私教程
qq服务器架构的思考
软考数据库-无损联接分解
一下载就服务器爆满了手机游戏
nodejs 连接数据库