shell的流程控制介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell的流程控制介绍相关的知识,希望对你有一定的参考价值。
Lnux shell和Java、php等语言不一样,它有一套自己的流程控制语句,其中包括条件语句(if,case),循环语句(for,while,until),循环控制语句(continue,break,shift)。下面我会通过一些简单明了的例子来介绍下各个语句的使用方法。
一、条件语句
1、if语句
(1)单分支结构
if 判断条件; then
条件为真的分支代码
fi
示例:testif1.sh
#!/bin/bash a=5 if [[ a -gt 4 ]] ;then echo ‘ok‘ fi
(2)双分支结构
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
示例:testif2.sh
#!/bin/bash scores=40 if [[ $scores -gt 60 ]];then echo "pass" else echo "no pass" fi
这里有个要特别注意的一点,就是结尾的fi是if倒过来拼写,和接下来要介绍的case同样的用法,case的结尾esac也是case倒过来的拼写,千万不要写错了,小编在第一次写脚本的时候就没注意到这一点,就总是出错,仔细一检查脚本原来是结尾符号写反了,真的很尴尬呀!然后我就发现了一个减少错误的方法:就是在写条件语句或是循环语句时,首先把语句的格式给写完,然后再向里边添加要实现的语句,这样就不会忘了写结尾或是写反了。其实这也只是我个人的习惯。
(3)多分支结构
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
示例:testif3.sh
#!/bin/bash scores=40 if [[ $scores -gt 90 ]];then echo "very good!" elif [[ $scores -gt 80 ]]; then echo "good!" elif [[ $scores -gt 60 ]]; then echo "pass!" else echo "no pass!" fi
2、case语句
case 变量引用 in
PAT1)
分支1;;
PAT2)
分支2;;
......
*)
默认分支;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
示例:testcase.sh
#/bin/bash echo " 本店菜品: 1.羊肉汤 2.辣子鸡丁米饭 3.胡辣汤 4.饺子 5.拉面 6.烩面 read -p "请输入序号查看价格: " num case $num in 1|4) echo "20¥" ;; 3|6) echo "10¥" ;; 2|5) echo "12¥" ;; *) echo "输入错误" ;; esac unset num
二、循环语句
1、for循环
for 变量名 in 列表;do
循环体
done
或
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
注意:列表的方式可为:{1..n}、`seq 1 $n` 、/root/bin/*.sh
for循环的执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
示例:testfor1.sh
#!/bin/bash for i in $(seq 10); do #或 for i in `seq 1 10`; do echo $i done
说明:seq字符串只要用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。
示例:testfor2.sh,这种格式类似于c语言格式,学过编程的应该都能看懂的。
#!/bin/bash for((i=1;i<=10;i++));do echo $i done
2、while循环
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环。因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正。
进入条件:CONDITION为true
退出条件:CONDITION为false
示例:testwhile1.sh
#!/bin/bash i=10; while [[ $i -gt 5 ]];do echo $i let i-- done
运行结果:==============================
testwhile1.sh
10
9
8
7
6
这里使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令
示例:testwhile2.sh(循环读取文件中的内容)
#!/bin/bash while read line;do echo $line done < /etc/passwd
while循环还可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
示例:testwhile3.sh
#!/bin/bash echo ‘按下 <CTRL-D> 退出‘ echo -n ‘输入你最喜欢的网站名: ‘ while read FILM do echo "是的!$FILM 是一个好网站" done
运行结果:==============================
[[email protected] shell]#bash whileread1.sh
按下 <CTRL-D> 退出
输入你最喜欢的网站名: 菜鸟教程
是的!菜鸟教程 是一个好网站
while无限循环:
while true(:); do 循环体 done
3、until循环
until CONDITION; do
循环体
done
意思是:直到满足条件,就退出。否则执行循环体的内容。
进入条件:CONDITION为false
退出条件:CONDITION为true
until语句的执行正好和while相反,其实在平常写脚本时,小编还是比较喜欢用while,感觉用着特别顺手。
示例:testuntil.sh
#!/bin/bash a=10 until [[ $a -lt 0 ]];do echo $a let a-- done
until无限循环:
until false; do 循环体 done
三、循环控制语句
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:continue和break。
1、continue,主要用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层。
continue 不会跳出所有循环,仅仅跳出当前循环。
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
示例:testcontinue.sh
#!/bin/bash while true ;do read -p "输入 1 到 5 之间的数字: " aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done
运行结果:===================================
[[email protected] bin]#testcontinue.sh
输入 1 到 5 之间的数字: 2
你输入的数字为 2!
输入 1 到 5 之间的数字: 7
你输入的数字不是 1 到 5 之间的!
输入 1 到 5 之间的数字: 3
你输入的数字为 3!
2、break
break [N]:提前结束第N层循环,最内层为第1层。
break命令允许跳出所有循环,下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
示例:testbreak.sh
#!/bin/bash while true;do read -p "输入 1 到 5 之间的数字:" aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done
运行结果:====================================
[[email protected] bin]#testbreak.sh
输入 1 到 5 之间的数字:2
你输入的数字为 2!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束
结合上边两个例子,我们可以看出:在continue循环中,如果输入的不是1~5之间的数字,就会继续运行脚本重新输入,而不是退出脚本,相当于进入了死循环,因此,echo "游戏结束"这行代码永远就不会被执行;而在break循环中,如果输入的不是1~5之间的数字,就会跳出循环,退出脚本。
3、shift
用于将参量列表list 左移指定次数,缺省为左移一次。v
参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到shift。
示例:./doit.sh a b c d e f g h
#!/bin/bash while [ $# -gt 0 ] # or (( $# > 0 ));do echo $* shift done
./shfit.sh a b c d e f g h
#!/bin/bash until [ -z "$1" ] ;do echo "$1" shift done echo
最后还有一个不太常用的工具:select。
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入。用户输入被保存在内置变量 REPLY 中。
select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本。也可以按ctrl+c 退出循环。格式如下:
select variable in list
do
循环体命令
done
示例:testselect.sh
#/bin/bash PS3="请选择菜单:" select menu in 羊肉汤 辣子鸡丁 米饭 胡辣汤 饺子 拉面 烩面;do case $REPLY in 1|4) echo "20¥" ;; 3|6) echo "10¥" ;; 2|5) echo "12¥" ;; 7) break ;; *) echo "输入错误" ;; esac
以上是关于shell的流程控制介绍的主要内容,如果未能解决你的问题,请参考以下文章