Shell_07_逻辑结构
一、if 判断
if … then … fi
单层
如果 是真的 那么 …
if [ 条件判断式 ];then当条件判断式成立时,可以进行的命令。fi # 结束这个判断语句结构
示例:
提示输入一个整数,程序判断输入的值是否大于 18
风格 1
#!/usr/bin/env shread -p \"请输入一个整数:\" numif [ \"$num\" -gt 18 ];thenecho \"你输入的数值大于 18\"fiecho \"hello...\"
风格2
#!/usr/bin/env shread -p \"请输入一个整数:\" numif [ \"$num\" -gt 18 ]thenecho \"你输入的数值大于 18\"fiecho \"hello...\"
if … then … else…fi
多重、复杂条件判断式
如果 是真的 那么 … 否则 …
一颗红心,两手准备if [ 条件判断式 ]; then当条件判断式成立时,可以进行的指令工作内容;else当条件判断式不成立时,可以进行的指令工作内容;fi
示例:
判断用户输出的字符串
输入y就输出文本内容 “script is running…”
否则输出文本内容 “STOP”
image
if … elif … elif … else … fi
多个条件判断 (if … elif … elif … else) 分多种不同情况执行
if [ 条件判断式一 ]; then当条件判断式一成立时,可以进行的指令工作内容;elif [ 条件判断式二 ]; then当条件判断式二成立时,可以进行的指令工作内容;else当条件判断式一与二均不成立时,可以进行的指令工作内容;fi
注意
elif也是个判断式,因此出现
elif后面都要接
then来处理!但是
else已经是最后的没有成立的结果了, 所以
else后面并没有
then
示例
通过判断输入的整数,判断是什么常用服务
#!/usr/bin/env shread -p \"请输入一个常用的服务默认端口号:\" portif [ \"$port\" -eq 80 ];thenecho \"HTTP 服务\"elif [ \"$port\" -eq 3306 ];thenecho \"Mysql 服务\"elif [ \"$port\" -eq 21 ] || [ \"$port\" -eq 20 ];thenecho \"FTP 服务\"elif [ \"$port\" -eq 22 ];thenecho \"SSHD 服务\"elif [ \"$port\" -eq 23 ];thenecho \"Telnet 服务\"elseecho \"未知服务\"fi
实战案例
服务状态检测工具
通过获取目前系统中的服务进程,判断都有那些服务处于运行状态
在判断中支持正则
使用双中括号
[[ ]]
- 匹配 使用
=~
比如:
[[ \"$val\" =~ [a-z]+ ]]
=~表示 匹配
[a-z+]是正表达式,不需要用任何引号,用了引号就会被识别为普通字符串
- 不匹配 使用
!
比如:
[[ ! \"$val\" =~ [0-9]+ ]]
示例
#!/usr/bin/env shname=sharkif [[ \"$name\" =~ [a-z]+ ]];thenecho \"ok\"fiif [[ ! \"$name\" =~ [0-9]+ ]];thenecho \"good\"fi
嵌套
#!/usr/bin/env shread -p \"请输入一个常用的服务默认端口号:\" portif [[ \"$port\" =~ [0-9]+ ]];thenif [ \"$port\" -eq 80 ];thenecho \"HTTP 服务\"elif [ \"$port\" -eq 3306 ];thenecho \"Mysql 服务\"elif [ \"$port\" -eq 21 ] || [ \"$port\" -eq 20 ];thenecho \"FTP 服务\"elif [ \"$port\" -eq 22 ];thenecho \"SSHD 服务\"elif [ \"$port\" -eq 23 ];thenecho \"Telnet 服务\"elseecho \"未知服务\"fielseecho \"nmber\"fi
二、 利用 case … esac 判断
基本语法
case $变量名称 in <==关键字为 case ,还有变量前有钱字号\"第一个变量的值\") <==每个变量内容建议用双引号括起来,关键字则为小括号 )程序段;; <==每个类别结尾使用两个连续的分号来处理!\"第二个变量的值\")程序段;;*) <==最后一个变量内容都会用 * 来代表所有其他值不包含第一个变量内容与第二个变量内容的其他程序运行段exit 1;;esac <==反过来写,结束当前语句结构!
运维工具箱
========================================================
模式还可以是多个
#!/bin/bashcat << EOFm|M) show memory usages;d|D) show disk usages;q|Q) quitEOFread -p \"Your choice\" choicecase $choice inm|M)free -m;;d|D)df -h;;q|Q)exit;;*)eco \"Invalid input\";;esac
三、while … do … done (不确定的循环)
while [ condition ] ==>中括号内的状态就是判断式do ==> do 是循环的开始!命令或者代码命令或者其他逻辑语句done ==> done 是循环的结束
计数
每次循环体执行完,while 都会检查条件是否为真,为真继续循环,否则终止循环。
n=0while [ \"$n\" -lt 5 ]dolet n++echo \"$n\"done
读文件
while read linedoecho $linedone < /etc/passwd
每次循环, 都会把
/etc/passwd中的每一个行内容 赋值给变量
line
五、 for do done (固定的循环)
image
var 是变量名
con1 con2 con3是常量,就是具体的数据
也可以是一个已经被赋值的变量, 写法${v1} ${v2}
以上面的例子来说,这个
$var的变量内容在循环工作时会动态的改变:
- 第一次循环时,
$var的内容为 con1 ;
- 第二次循环时,
$var的内容为 con2 ;
- 第三次循环时,
$var的内容为 con3 ;
- …
for 循环中 变量的取值方式
a. 从一组字符串中取值
for var in one two three four fivedoecho \"****************************\"echo \'$var is \' $vardone
b. 从位置变量中取值
for vardoecho \'-----------------------------\'echo \'$var is \' $vardone
按照如下方式执行:
image
c. 从累计变化的格式中取值
#!/bin/bashfor ((var=1;var<=10;var++))doecho \"------------------------\"echo \'$var is \' $vardone
d. 从命令结果中取值
#!/bin/bashfor var in $(cat file.txt)doecho \" ------------------------\"echo \'$var is \' $vardone
IFS
修改
for
循环中的分界符,默认是
空格
示例
a.txt
文件的内容
hello world name agehello world name age
# 先保存原来的值old_ifs=$IFS# 设置分界符为 回车IFS=$\'\\n\'for line in $(cat a.txt)doecho $linedone# 把变量的值回复成原来的状态export IFS=$old_ifs
嵌套循环
for n in {1..3}dofor i in {a..e}doecho \"外层循环的值$n--内层循环的值$i\"doneecho \"----------------\"done
执行结果
image
补充:数值运算
➜ ~ n=1➜ ~ let n++➜ ~ echo $n2➜ ~ (( n++ ))➜ ~ echo $n3➜ ~ a=2➜ ~ b=3➜ ~ let f=a+b➜ ~ echo $n3➜ ~ echo $f5➜ ~ let f = a + b ==> 错误zsh: bad math expression: operand expected at `=\'➜ ~ let \"f = a + b\"➜ ~ echo $f5
六、break 和 continue
-
break
就是退出循环,循环不再继续了。假如是嵌套的循环,就是退出当前层级的循环。
-
continue
是停止本次循环体内的代码,继续进行下一次循环。
1. 单层循环的 break
示例代码
image
运行结果
image
2. 单层循环的 continue
示例代码
image
执行结果
image
3. 多层循环的 break
示例代码
image
执行结果
- 单层循环的 break
示例代码
[外链图片转存中…(img-Sdo21U8T-1591982283144)]
image
运行结果
[外链图片转存中…(img-P4Rrxq0x-1591982283146)]
image
2. 单层循环的 continue
示例代码
[外链图片转存中…(img-XWcRuuba-1591982283147)]
image
执行结果
[外链图片转存中…(img-yHjyzw8j-1591982283148)]
image
3. 多层循环的 break
示例代码
[外链图片转存中…(img-U0L7FYFN-1591982283149)]
image
执行结果
[外链图片转存中…(img-6jbvuJWr-1591982283152)]