您的位置:首页 > 运维架构 > Shell

shell脚本之流程控制

2017-09-17 23:47 260 查看

shell脚本之流程控制

shell脚本之流程控制

条件语句

条件判断

循环语句for,while,until

for循环

while循环

until循环

循环控制语句continue

循环控制语句break

循环控制shift命令

创建无限循环

while的特殊用法

for的特殊用法

select循环与菜单

select与case

信号捕捉trap

条件语句

选择执行:

  注意: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
echo'Station1isUP'
elif grep"station1"~/maintenance.txt&>/dev/null ;then
echo'Station1isundergoingmaintenance‘
else
echo'Station1isunexpectedlyDOWN!' exit1
fi


条件判断

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


case支持glob风格的通配符:

*:任意长度任意字符


?:任意单个字符


[]:指定范围内的任意单个字符


a|b: a或b


循环语句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层的本轮循环,而直接进入下一轮判断;最内层为第1层

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


循环控制语句break

break
:提前结束第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


#!/bin/bash
# Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]

while[ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done


#!/bin/bash
#step through all the positional parameters

until[-z "$1"]
do
echo "$1"
shift
done
echo


创建无限循环

while true;do

循环体

done


until false;do

循环体

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


控制变量初始化:仅在运行到循环代码段时执行一次

控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

例如:

for((i=0;i<=20;i++))
do
  echo "Helllo I am $i"
done


select循环与菜单

select variable in list
do
循环体命令
done


select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示
PS3 提示符
,等待用户输入。

用户输入菜单列表中的某个数字,执行相应的命令

用户输入被保存在内置变量
REPLY


select与case

select 是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也可以按ctrl+c 退出循环。

select 经常和case 联合使用

与for 循环类似,可以省略in list,此时使用位置参量

示例:

PS3="please input numbert: "
select menu in 羊肉汤 米饭 胡辣汤 饺子 拉面 烩面 quit;do
  case $REPLY in
  1)
    echo "羊肉汤,the price is 15."
    ;;
  2)
    echo "米饭,the price is 12."
    ;;
  3)
    echo "胡辣汤,the price is 30."
    ;;
  4)
    echo "饺子,the price is 20."
    ;;
  5)
    echo "拉面,the price is 12."
    ;;
  6)
    echo "烩面,the price is 10."
    ;;
  7)
    break
    ;;
  esac
done


信号捕捉trap

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


示例:

#!/bin/bash

trap 'echo "signal:SIGINT"' int

trap -p
for((i=0;i<=10;i++))
do
  sleep 1
  echo $i
done

trap '' int
trap -p
for((i=11;i<=20;i++))
do
  sleep 1
  echo $i
done

trap '-' int
trap -p
for((i=21;i<=30;i++))
do
  sleep 1
  echo $i
done



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: