continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
格式:
while CONDITION1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
范例:
#!/bin/bash
for ((i=0;i<10;i++));do
for((j=0;j<10;j++));do
[ $j -eq 5 ] && continue 2
echo $j
done
echo ---------------------------
done
break [N]:提前结束第N层整个循环,最内层为第1层
格式:
范例:
while CONDITION1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
[root@centos7wyj data]$bash break.sh
0
1
2
3
4
[root@centos7wyj data]$cat break.sh
#!/bin/bash
for ((i=0;i<10;i++));do
for((j=0;j<10;j++));do
[ $j -eq 5 ] && break 2
echo $j
done
echo ---------------------------
done
[root@centos7wyj data]$
shift [n] 用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到SHIFT
范例脚本:
#!/bin/bash
passwd=12345678
if [ $# -eq 0 ];then
echo "Usage: `basename $0` user1 user2 ..."
exit
fi
while [ -n "$1" ] ;do
if id $1 &> /dev/null;then
echo user $1 exist。
else
useradd $1
echo $passwd | passwd --stdin $1 &> /dev/null
echo $1 user is created, passwd is 12345678
fi
shift
done
while read 的 特殊用法
while 循环的特殊用法,遍历文件或文本的每一行
格式:
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
范例:
[root@centos8 ~]#echo magedu | read X ; echo $X
[root@centos8 ~]#echo magedu | while read X ; do echo $X;done
magedu
[root@centos8 ~]#echo magedu | { read X ; echo $X; }
magedu
[root@centos8 ~]#echo magedu | ( read X ; echo $X )
magedu
[root@centos8 ~]#echo mage wang zhang | ( read X Y Z; echo $X $Y $Z )
mage wang zhang
[root@centos8 ~]#echo mage wang zhang | while read X Y Z; do echo $X $Y $Z;done
mage wang zhang
while read检查磁盘空间:
[root@centos8 ~]#echo magedu | read X ; echo $X
[root@centos8 ~]#echo magedu | while read X ; do echo $X;donemagedu
[root@centos8 ~]#echo magedu | { read X ; echo $X; }magedu
[root@centos8 ~]#echo magedu | ( read X ; echo $X )magedu
[root@centos8 ~]#echo mage wang zhang | ( read X Y Z; echo $X $Y $Z )mage wang zhang
[root@centos8 ~]#echo mage wang zhang | while read X Y Z; do echo $X $Y $Z;donemage wang zhang
范例:单词文件
[root@centos6 ~]#wc -l /usr/share/dict/linux.words479829 /usr/share/dict/linux.words
select 循环与菜单
select NAME [in WORDS ... ;] do COMMANDS; done
select variable in list ;do
循环体命令
done
说明:
select 循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中
select 是个无限循环,因此要用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c
退出循环
select 经常和 case 联合使用
与 for 循环类似,可以省略 in list,此时使用位置参量
范例:
cat select.sh
#!/bin/bash
sum=0
PS3="请点菜(1-6): "select MENU in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;do
case $REPLY in1)echo $MENU 价格是 100
let sum+=100
;;
2)echo $MENU 价格是 88
let sum+=88
;;
3)echo $MENU价格是 66
let sum+=66
;;
4)echo $MENU 价格是 166
let sum+=166;;
5)echo $MENU 价格是 200
let sum+=200
;;
6)
echo "点菜结束,退出"
break
;;
*)echo "点菜错误,重新选择"
;;
esac
doneecho "总价格是: $sum"