Shell_07_逻辑结构
2020-06-22 04:26
573 查看
Shell_07_逻辑结构
一、if 判断
if … then … fi
单层
如果 是真的 那么 …
if [ 条件判断式 ];then 当条件判断式成立时,可以进行的命令。 fi # 结束这个判断语句结构
示例:
提示输入一个整数,程序判断输入的值是否大于 18
风格 1
#!/usr/bin/env sh read -p "请输入一个整数:" num if [ "$num" -gt 18 ];then echo "你输入的数值大于 18" fi echo "hello..."
风格2
#!/usr/bin/env sh read -p "请输入一个整数:" num if [ "$num" -gt 18 ] then echo "你输入的数值大于 18" fi echo "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 sh read -p "请输入一个常用的服务默认端口号:" port if [ "$port" -eq 80 ];then echo "HTTP 服务" elif [ "$port" -eq 3306 ];then echo "Mysql 服务" elif [ "$port" -eq 21 ] || [ "$port" -eq 20 ];then echo "FTP 服务" elif [ "$port" -eq 22 ];then echo "SSHD 服务" elif [ "$port" -eq 23 ];then echo "Telnet 服务" else echo "未知服务" fi
实战案例
服务状态检测工具
通过获取目前系统中的服务进程,判断都有那些服务处于运行状态
在判断中支持正则
使用双中括号
[[ ]]
- 匹配 使用
=~
比如:
[[ "$val" =~ [a-z]+ ]]
=~表示 匹配
[a-z+]是正表达式,不需要用任何引号,用了引号就会被识别为普通字符串
- 不匹配 使用
!
比如:
[[ ! "$val" =~ [0-9]+ ]]
示例
#!/usr/bin/env sh name=shark if [[ "$name" =~ [a-z]+ ]];then echo "ok" fi if [[ ! "$name" =~ [0-9]+ ]];then echo "good" fi
嵌套
#!/usr/bin/env sh read -p "请输入一个常用的服务默认端口号:" port if [[ "$port" =~ [0-9]+ ]];then if [ "$port" -eq 80 ];then echo "HTTP 服务" elif [ "$port" -eq 3306 ];then echo "Mysql 服务" elif [ "$port" -eq 21 ] || [ "$port" -eq 20 ];then echo "FTP 服务" elif [ "$port" -eq 22 ];then echo "SSHD 服务" elif [ "$port" -eq 23 ];then echo "Telnet 服务" else echo "未知服务" fi else echo "nmber" fi
二、 利用 case … esac 判断
基本语法
case $变量名称 in <==关键字为 case ,还有变量前有钱字号 "第一个变量的值") <==每个变量内容建议用双引号括起来,关键字则为小括号 ) 程序段 ;; <==每个类别结尾使用两个连续的分号来处理! "第二个变量的值") 程序段 ;; *) <==最后一个变量内容都会用 * 来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序运行段 exit 1 ;; esac <==反过来写,结束当前语句结构!
运维工具箱
========================================================
模式还可以是多个
#!/bin/bash cat << EOF m|M) show memory usages; d|D) show disk usages; q|Q) quit EOF read -p "Your choice" choice case $choice in m|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=0 while [ "$n" -lt 5 ] do let n++ echo "$n" done
读文件
while read line do echo $line done < /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 five do echo "****************************" echo '$var is ' $var done
b. 从位置变量中取值
for var do echo '-----------------------------' echo '$var is ' $var done
按照如下方式执行:
image
c. 从累计变化的格式中取值
#!/bin/bash for ((var=1;var<=10;var++)) do echo "------------------------" echo '$var is ' $var done
d. 从命令结果中取值
#!/bin/bash for var in $(cat file.txt) do echo " ------------------------" echo '$var is ' $var done
IFS
修改
for循环中的分界符,默认是
空格
示例
a.txt文件的内容
hello world name age hello world name age
# 先保存原来的值 old_ifs=$IFS # 设置分界符为 回车 IFS=$'\n' for line in $(cat a.txt) do echo $line done # 把变量的值回复成原来的状态 export IFS=$old_ifs
嵌套循环
for n in {1..3} do for i in {a..e} do echo "外层循环的值$n--内层循环的值$i" done echo "----------------" done
执行结果
image
补充:数值运算
➜ ~ n=1 ➜ ~ let n++ ➜ ~ echo $n 2 ➜ ~ (( n++ )) ➜ ~ echo $n 3 ➜ ~ a=2 ➜ ~ b=3 ➜ ~ let f=a+b ➜ ~ echo $n 3 ➜ ~ echo $f 5 ➜ ~ let f = a + b ==> 错误 zsh: bad math expression: operand expected at `=' ➜ ~ let "f = a + b" ➜ ~ echo $f 5
六、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)]
相关文章推荐
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
- MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果
- shell 编程语法总结(I/O 逻辑控制结构)
- shell脚本结构、date命令、变量 shell脚本中的逻辑判断 文件目录属性判断 if特殊用法 case判断
- shell scripts的控制逻辑结构自结
- SQL Server中TempDB管理(version store的逻辑结构)
- oracle存储的逻辑结构和物理结构
- 【scikit-learn】07:数据加载,数据归一,特征选择,逻辑回归,贝叶斯,k近邻,决策树,SVM
- Shell学习(shell脚本,date,变量和逻辑判断)-2018.12.24
- 2.3.1 逻辑结构设计方法
- 设计一个简易的处理器(9)--PIPE的硬件结构, 流水线控制逻辑
- J2EE逻辑体系结构
- Oracle体系结构之-逻辑结构
- shell 基本计算、逻辑运算、位运算详解
- [Oracle] 逻辑结构实验与总结
- Shellcode结构图
- SHELL脚本中常用的控制结构
- oracle 体系结构(物理结构、逻辑结构与内存结构)
- Oracle Class6-1. PL/SQL 简介(数据类型,逻辑比较,控制结构,错误处理)