一步一步了解并搞懂shell脚本第二部分

嵌入式技术

1368人已加入

描述

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

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分