13.3.5 case逻辑判断
在shell脚本中,除了用if来判断逻辑外,还有一种常用的方式——case。其具体格式如下:
case 变量 in value1) command ;; value2) command ;; value3) command ;; *) command ;; esac
上面的结构中,不限制value的个数,*代表其他值。下面阿铭写一个判断输入数值是奇数还是偶数的脚本,如下所示:
# vim case.sh //内容如下 #! /bin/bash read -p "Input a number: " n a=$[$n%2] case $a in 1) echo "The number is odd." ;; 0) echo "The number is even." ;; *) echo "It's not a number!" ;; esac
脚本中$a的值为1或0,其执行结果如下:
# sh case.sh Input a number: 100 The number is even. # sh case.sh Input a number: 101 The number is odd.
13.4 shell脚本中的循环
shell脚本可以算是一种简易的编程语言了,脚本中的循环也是不能缺少的。常用到的循环有for循环和while循环,下面我们就分别介绍一下这两种循环结构。
13.4.1 for循环
for循环结构是阿铭在日常运维工作中使用最频繁的循环结构。下面阿铭先写个简单的for循环脚本,如下所示:
# vim for.sh //内容如下 #! /bin/bash for i in `seq 1 5`; do echo $i done
脚本中的seq 1 5表示从1到5的一个序列。你可以直接运行这个命令试下。该脚本的执行结果如下:
# sh for.sh 1 2 3 4 5
通过这个脚本就可以看到for循环的基本结构,具体格式如下:
for 变量名 in 循环的条件; do command done
这里“循环的条件”可以是一组字符串或者数字(用一个或者多个空格隔开), 也可以是一条命令的执行结果。为了方便演示,阿铭以一条命令的形式给大家举例,命令如下:
# for i in 1 2 3 a b; do echo $i; done 1 2 3 a b
“循环的条件”还可以引用系统命令的执行结果(如seq 1 5),但必须用反引号括起来。示例命令如下:
# for file in `ls`; do echo $file; done case.sh first.sh for.sh if1.sh if2.sh if3.sh option.sh read.sh sum.sh variable.sh
13.4.2 while循环
阿铭常常用while循环来编写死循环的脚本,用于监控某项服务。while循环的格式也很简单,如下所示:
while 条件; do command done
示例脚本如下:
# cat while.sh #! /bin/bash a=5 while [ $a -ge 1 ]; do echo $a a=$[$a-1] done
该脚本的执行结果如下:
# sh while.sh 5 4 3 2 1
另外,你可以用一个冒号代替循环条件,这样可以做到死循环。示例代码如下:
while :; do command sleep 3 done
13.5 shell脚本中的函数
shell脚本中的函数就是先把一段代码整理到一个小单元中,并给这个小单元命名,当用到这段代码时直接调用这个小单元的名字即可。有时候脚本中的某段代码总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样不仅节省时间还节省空间。
下面阿铭写一个简单的带有函数功能的shell脚本,示例脚本如下:
# vim func.sh //内容如下 #! /bin/bash function sum() { sum=$[$1+$2] echo $sum } sum $1 $2
该脚本的执行结果如下:
# sh func.sh 1 2 3
func.sh中的sum()为自定义的函数。在shell脚本中函数的格式如下:
function 函数名() { command1 command2 }
值得注意的是,在shell脚本中,函数一定要写在最前面,不能出现在中间或者最后。因为函数是要被调用的,如果还没有出现就被调用,肯定会出错。
13.6 shell脚本中的中断和继续
在shell脚本循环的过程中,我们难免会遇到一些特殊需求,比如当循环到某个地方时需要做一些事情,这时候很有可能需要退出循环,或者跳过本次循环,这样的需求如何实现呢?
13.6.1 break
首先有一点你需要明白,break用在循环中,不管是for或者while都可以。在脚本中使用它,表示退出该层循环。之所以说层,是因为有时我们会用到嵌套循环,大循环里面还有小循环,而break仅仅是退出那一层循环,它的上层循环不受影响。下面阿铭给大家写一个break的示例,如下所示:
# vim break.sh //内容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then break fi echo $i done echo aaaaaaa
脚本中,本意是要把1~5数值赋予i,当i等于3时,会跳出循环,后面的4和5都不会再执行了。该脚本的执行结果如下:
# sh break.sh 1 1 2 2 3 aaaaaaa
13.6.2 continue
continue也是使用在循环中的,但和break不同的是,当在shell脚本中遇到continue时,结束的不是整个循环,而是本次循环。具体示例如下:
# vim continue.sh //内容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then continue fi echo $i done echo $i
脚本执行结果如下:
# sh continue.sh 1 1 2 2 3 4 4 5 5 5
当i等于3的时候,出现了continue,所以结束本次循环,continue后面的语句不再执行,继续下一次循环。
13.6.3 exit
其实,还有一个和break、continue类似的用法,那就是exit,它的作用范围更大,直接退出整个shell脚本。示例脚本如下:
# vim exit.sh //内容如下 #!/bin/bash for i in `seq 1 5` do echo $i if [ $i == 3 ] then exit fi echo $i done echo aaaaaaa
这个就很容易理解了,脚本执行结果如下:
# sh exit.sh 1 1 2 2 3
审核编辑:汤梓红
评论
查看更多