循环 for, while, until
for
for $var in list; do
commands
done
列表生成方式
- 直接给出列表
- 整数列表
- {start..end}
- $(seq[startseq] [step] end)
- 返回列表的命令 $(COMMAND)
- 使用glob,*.sh
- 变量引用,*
# 扫描192.168.3网段alive的机器
NETID=192.168.3
for HOSTID in {1..254};do
{
ip=$NETID.$HOSTID
ping -c3 -W1 $ip &>/dev/null && echo $ip is alive
} &
done
wait
# 打印*
read -p "Input row: " ROW
read -p "Input column: " COL
for i in `seq $ROW`;do
for j in `seq $COL`;do
echo -e '*\c'
done
echo
done
# 乘法表
for i in `seq 1 9`;do
for j in `seq 1 $i`;do
echo -ne "${j}x${i}=$[$i*$j]\t"
done
echo
done
for变体
- ((...))用于算术运算,可以实现C语言风格的变量操作
for
- for循环特殊格式
for ((控制变量初始化;条件判断表达式;控制变量变化))
do
循环体
done
# 打印等腰三角形
read -p "please input row:" ROW
for((i=1;i<=ROW;i++));do
spaces=ROW-i
for((j=1;j<=spaces;j++));do
echo -ne ' '
done
pluses=2*i-1
for((k=1;k<=pluses;k++));do
echo -ne '+'
done
echo
done
while循环
while CONDITION; do
循环体
done
# 检查httpd服务,fail了重启
while true;do
killall -0 /usr/sbin/httpd &>/dev/null || systemctl restart httpd
sleep 60
done
# 猜数字游戏
let N=$RANDOM%10+1
13 while read -p "please input a number: (between 1~10)" number;do
14 if [ $number -gt $N ];then
15 echo your number is greater
16 elif [ $number -lt $N ]; then
17 echo your number is smaller
18 else
19 echo you got it
20 exit
21 fi
22 done
until 循环
until CONDITION; do
commands
done
continue
提前结束本轮循环,直接进入下一轮判断
break
直接退出本层循环
shift
用于将参量列表 list 左移指定次数,缺省为左移一次。
while [ "$1" ];do
useradd $1
echo User:$1 is created
shift
done
echo finished
创建无限循环
while true; do
commands
done
while 经常用法
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
while read line; do
commands
done < /path/from/somefile
# 检查磁盘利用率
df | sed -rn '/^\/dev\/sd/s@([^[:space:]]+).* ([1-9]+).*@\1 \2@p' | while read part util; do
if [ $util -gt 15 ]; then
echo $part is close to full
fi
done
select 循环与菜单
PS3='Please input your choice'
select menu in pizza beef porks chicken; do true
case $REPLY in
1)
echo pizza
;;
2)
echo beef
;;
3)
echo porks
;;
4)
echo chicken
;;
*)
continue
;;
esac
done
PS3='Please input your choice'; select menu in pizza beef porks chicken; do true; done
- select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,
并显示 PS3 提示符,等待用户输入 - 用户输入菜单列表中的某个数字,执行相应的命令
- 用户输入被保存在内置变量 REPLY 中
- select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止
脚本。也可以按 ctrl+c 退出循环 - select 经常和 case 联合使用
- 与 for 循环类似,可以省略 in list,此时使用位置参量