shell脚本编程系列-06-循环

147 阅读2分钟

循环

bash也支持多种循环控制,比如常用的有whileforuntil,使用好这些循环结构是非常有必要的。有个故事是这样的:

老总📞秘书:这几天我带你出去玩,你准备下
秘书📞老公:过两天我要出差开会,你自己照顾自己
老公📞情人:这几天我老婆出差,出来玩吧
情人📞小孩:过两天不用上课了,老师临时有事情
小孩📞爷爷:老师有事不用上课,你陪我玩吧
爷爷📞秘书:我要陪孙子玩,不能带你出去了
秘书📞老公:公司安排有变,我不出差了
老公📞情人:不能出来玩了,我老婆不去出差了
情人📞小孩:这几天继续正常上课
小孩📞爷爷:还是要上课,你不用陪我玩了
爷爷📞秘书:这几天还是要带你去玩的,你准备下...

足以见得掌握好循环结构的重要性,怕翻车就赶紧跟着老司机操练起来吧。

for循环

基本结构是这样:

for name [in items ... ] ; do commands; done

for会循环列表中的每个元素,并重复执行后面的commands,每次循环列表中的一个元素会被赋值给name,其中列表元素是可选的,如果没有的话就默认循环$@也就是位置参数中的内容。下面看一个简单的示例:

#!/bin/bash

for food in "$@"; do
    [[ $food =~ [🚬|🍷] ]] && {
        echo "ignore $food"
        continue
    }
    [[ $food =~ 💊 ]] && {
        echo "game over $food"
        break
    }
    echo "I want $food"
done

看一下执行效果:

for.png

可以看到for循环的执行流程,并且在for循环中可以使用continue来跳过当前循环继续下一个元素的循环,使用break来提前终止整个循环。

while循环

基本结构是这样:

while condition; do commands; done

当条件成立,while循环会持续执行commands,直到条件不成立即终止。看示例:

#!/bin/bash

num=0
while [[ $num -ne 10 ]]; do
    num=$((num+1))
    [[ $num = 6 ]] && continue
    [[ $num -gt 8 ]] && break
    echo $num
done

可以看到while循环会先对指定条件进行测试,当条件成立时就会不停歇的执行内部的代码块,和for循环一样,也可以通过continue跳过当前循环进入下一循环,通过break提前终止循环。while循环通常会和read连用用于逐行读取文本内容,示例如下:

#!/bin/bash

while read -r line; do
    user=$(awk -F':' '{print $1}' <<<$line)
    uid=$(awk -F':' '{print $3}' <<<$line)
    [[ $uid = 0 ]] && echo "$user niubi"
done

看下执行结果:

while.png

可以看到当脚本中while循环体没有为其指定输入来源时,默认会接受标准输出作为输入,因此我们通过管道将passwd文件内容输入给了脚本,并得到了令人满意的结果,嗯。

until循环

和while循环类似,基本结构是这样:

until condition; do commands; done

与while不一样的是当条件不成立,until循环会持续执行commands,直到条件成立即终止。简单示例如下:

#!/bin/bash

num=0
until [[ $num -eq 10 ]]; do
    num=$((num+1))
    [[ $num = 4 ]] && continue
    [[ $num -gt 8 ]] && break
    echo $num
done

那么小问题来了,分别使用for/while/until如何写一个简短的死循环?😈

老司机提示: 请勿在生产环境调试代码!道路千万条,安全第一条,操作不规范,leader两行泪。