循环
bash也支持多种循环控制,比如常用的有while、for、until,使用好这些循环结构是非常有必要的。有个故事是这样的:
老总📞秘书:这几天我带你出去玩,你准备下
秘书📞老公:过两天我要出差开会,你自己照顾自己
老公📞情人:这几天我老婆出差,出来玩吧
情人📞小孩:过两天不用上课了,老师临时有事情
小孩📞爷爷:老师有事不用上课,你陪我玩吧
爷爷📞秘书:我要陪孙子玩,不能带你出去了
秘书📞老公:公司安排有变,我不出差了
老公📞情人:不能出来玩了,我老婆不去出差了
情人📞小孩:这几天继续正常上课
小孩📞爷爷:还是要上课,你不用陪我玩了
爷爷📞秘书:这几天还是要带你去玩的,你准备下...
足以见得掌握好循环结构的重要性,怕翻车就赶紧跟着老司机操练起来吧。
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循环的执行流程,并且在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循环体没有为其指定输入来源时,默认会接受标准输出作为输入,因此我们通过管道将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两行泪。