shell脚本之流程控制

Linuxbugs(卡西莫多伯伯)      2022-02-16     723

关键词:

 

 

shell脚本之流程控制


条件语句

选择执行:
注意:if语句可嵌套

单分支

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

双分支

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

多分支

if 判断条件1; then
    条件为真的分支代码
elif 判断条件2; then
    条件为真的分支代码
elif 判断条件3; then
    条件为真的分支代码
else
    以上条件都为假的分支代码
fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
示例:

if ping -c 1 -W 2 station1 &>/dev/null;then
    echoStation1isUP 
elif grep"station1"~/maintenance.txt&>/dev/null ;then
    echoStation1isundergoingmaintenance‘
else 
    echoStation1isunexpectedlyDOWN! exit1
fi

条件判断

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

case支持glob风格的通配符:

 
  1. *:任意长度任意字符
  2. ?:任意单个字符
  3. []:指定范围内的任意单个字符
  4. a|b: ab

循环语句for,while,until

 

for循环

for 变量名in 列表;do
    循环体
done

执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
列表生成方式

  • (1) 直接给出列表
  • (2) 整数列表:
  • (a) {start..end}
  • (b) $(seq[start [step]] end)
  • (3) 返回列表的命令 $(COMMAND)
  • (4) 使用glob,如:*.sh
  • (5) 变量引用;$@, $*
 

while循环

while CONDITION; do
    循环体
done

`CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

进入条件:CONDITION为true
退出条件:CONDITION为false

 

until循环

until CONDITION; do
    循环体
done

CONDITION同while
进入条件:CONDITION 为false
退出条件:CONDITION 为true

循环控制语句continue

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

while CONDTIITON1; do
CMD1
...
if CONDITION2; then
    continue
fi
CMDn
...
done

循环控制语句break

break [N]:提前结束第N层循环,最内层为第1层

while CONDTIITON1; do
CMD1
...
if CONDITION2; then
    break
fi
CMDn
...
done

循环控制shift命令

用于将参量列表list 左移指定次数,缺省为左移一次。
参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while循环遍历位置参量列表时,常用到shift。
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h

 
  1. #!/bin/bash
  2. # Name: doit.sh
  3. # Purpose: shift through command line arguments
  4. # Usage: doit.sh [args]
  5. while[ $# -gt 0 ] # or (( $# > 0 ))
  6. do
  7. echo $*
  8. shift
  9. done
 
  1. #!/bin/bash
  2. #step through all the positional parameters
  3. until[-z "$1"]
  4. do
  5. echo "$1"
  6. shift
  7. done
  8. echo
 

创建无限循环

 
  1. while true;do
  2. 循环体
  3. done
 
  1. until false;do
  2. 循环体
  3. done

while的特殊用法

while循环的特殊用法(遍历文件的每一行):

while read line; do
    循环体
done < /PATH/FROM/SOMEFILE

依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

for的特殊用法

双小括号方法,即((…))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作
I=10
((I++))

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
    循环体
done

控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
例如:

 
  1. for((i=0;i<=20;i++))
  2. do
  3. echo "Helllo I am $i"
  4. done

select循环与菜单

select variable in list
do
    循环体命令
done

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入。
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量REPLY

 

select与case

select 是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c 退出循环。
select 经常和case 联合使用
与for 循环类似,可以省略in list,此时使用位置参量
示例:

 
  1. PS3="please input numbert: "
  2. select menu in羊肉汤米饭胡辣汤饺子拉面烩面 quit;do
  3. case $REPLY in
  4. 1)
  5. echo "羊肉汤,the price is 15."
  6. ;;
  7. 2)
  8. echo "米饭,the price is 12."
  9. ;;
  10. 3)
  11. echo "胡辣汤,the price is 30."
  12. ;;
  13. 4)
  14. echo "饺子,the price is 20."
  15. ;;
  16. 5)
  17. echo "拉面,the price is 12."
  18. ;;
  19. 6)
  20. echo "烩面,the price is 10."
  21. ;;
  22. 7)
  23. break
  24. ;;
  25. esac
  26. done

信号捕捉trap

trap ‘触发指令‘ 信号
    自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作
trap ‘‘ 信号
    忽略信号的操作
trap ‘-‘ 信号
    恢复原信号的操作
trap -p
    列出自定义信号操作

示例:

 
  1. #!/bin/bash
  2. trap ‘echo "signal:SIGINT"‘ int
  3. trap -p
  4. for((i=0;i<=10;i++))
  5. do
  6. sleep 1
  7. echo $i
  8. done
  9. trap ‘‘ int
  10. trap -p
  11. for((i=11;i<=20;i++))
  12. do
  13. sleep 1
  14. echo $i
  15. done
  16. trap ‘-‘ int
  17. trap -p
  18. for((i=21;i<=30;i++))
  19. do
  20. sleep 1
  21. echo $i
  22. done





















存储过程之流程控制语句

阅读目录:通过条件、循环语句,对处理程序进行流程控制条件控制    IF条件:条件为真,执行    CASE条件:匹配到,执行循环控制    WHILE循环:先判断后执行    REPEAT循环:先执行后判断    LOOP循环... 查看详情

mysql之流程控制语句

参考技术AMYSQL的流程控制语句也只能用于存储过程,主要有3类:跳转语句ITERATE:只能用在循环语句内,表示重新开始循环。LEAVE:可以用在循环语句内,或者以BEGIN和END包裹起来的程序体内,表示跳出循环或跳出程序体的操作。... 查看详情

python之流程控制(代码片段)

Python之流程控制if语句条件判断语句ifa==b:pass#满足条件再执行ifa==b:passelse:pass#满足条件执行第一种语句,不满足条件则执行第二种语句ifa==b:#条件1pass#语句1elifa>b:#条件2pass#语句2else:pass#语句3如果满足条件1,则执行语句1,语句2... 查看详情

java基础之流程控制

一、顺序结构    顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。  if-else-if语句语法:  if(条件){        当条件为true时,执行大括号内... 查看详情

puppet之流程控制介绍

1 概述puppet流程控制语句有四种,if,case,selector,unless(3.7版本后引入),由于unless是if单分支语句取反,因此,本文重点介绍if,case,selector三种语法的使用备注:本文的相关内容摘自文章:https://www.dwhd.org/20150609_155030.html2 if语... 查看详情

java篇之流程控制语句

条件判断语句 条件语句:If(boolean类型)else   (打大括号避免出错)  switch(export)语句:export的类型必须是byte,short,char,int,Stringenum;Switch(export){Case(n):语句;Break;(不输入它的话会顺序执行下一分支,遇到才会跳... 查看详情

阿花宝宝java基础笔记之流程控制

1.语法:if(条件1){          //代码1       }elseif(条件2){          //代码块2& 查看详情

go语言基础之流程控制(代码片段)

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制... 查看详情

java程序猿之流程控制与数组

  分支语句  if括号里的只能是一个逻辑表达式,即这个表达式返回的值只能是true或false。  代码块用花括号括起来,一个代码块通常被当成一个整体来执行(除非遇到return、break、continue等关键字,或者遇到异常)。  ... 查看详情

2_基本语法之流程控制之循环结构

1.循环结构的四要素  ①初始化条件  ②循环条件--->是boolean类型  ③循环体  ④迭代条件  说明:通常情况下,循环结束都是因为②中循环条件返回false了。2.三种循环结构:  2.1for循环结构  for(①;②;④)  ... 查看详情

java学习之流程控制语句(选择结构)

 流程控制语句1选择结构ifif语句有三种语法格式,每一种格式都有它自身的特点。1.1if语句if语句是指如果满足某种条件,就进行某种处理。在Java中,if语句的具体语法格式如下:if(条件语句){   执行语句;  ... 查看详情

阿花宝宝java基础笔记之流程控制

1.各循环可互相嵌套   一般不超过三层   外层循环变量变化一次,内层循环变量要变化一遍  注意点:循环次数。(内层循环次数*外层循环次数)2.break语句的使用 break语句用于终止某个循环,使... 查看详情

go语言学习——go语言基础之流程控制二

使用switch语句方便对大量的值进行条件判断packagemainimport"fmt"//流程控制之跳出for循环funcmain()//当i=5时就跳出for循环fori:=0;i<10;i++ifi==5break//跳出for循环 查看详情

基本语法之流程控制之关键字:break和continue

break和continue关键字的使用   使用范围 循环中使用的作用(不同点) 相同点  break: switch-case   循环结构中 结束当前循环 关键字后面不能声明执行语句 continue: 循环结构中 结束当次循环 关键字后面不能声明... 查看详情

1.golang开发之流程控制(代码片段)

Golang开发之流程控制1.条件判断(if)Go语言if条件判断格式如下:if表达式1分支1elseif表达式2分支2else分支3Go规定与if匹配的左括号“”必须与if和表达式放在同一行,如果尝试将“”放在其它位置,将会触发编译错误,... 查看详情

django之流程

关键点路由视图模板orm中间件 查看详情

go语音基础之流程控制if语句

Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。顺序结构:程序按顺序执行,不发生跳转。 选择结构:依据是否满足条件,有选择的执行相应功能。循环结构:依据条件是否满足,循环多次执行某... 查看详情

3.go语言基础之流程控制(代码片段)

1.ifelse(分支结构)1.1if判断基本语法if条件判断的格式如下:if表达式1分支1elseif表达式2分支2else分支3Go语言规定与if匹配的左括号必须与if和表达式放在同一行,放在其他位置会触发编译错误。同理,与else匹配的也必须与else写在同... 查看详情