Shell跳出循环
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break和continue
- Break:跳出整个循环
- Continue:跳过本次循环,进行下次循环
break概述:
跳出当前整个循环或结束当前循环,在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,后面如果什么也不加,表示跳出当前循环等价于break 1,也可以在后面加数字,假设break 3表示跳出第三层循环
continue概述:
忽略本次循环剩余的代码,直接进行下一次循环;在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,如果后面加的数字是1,表示忽略本次条件循环,如果是2的话,忽略下来2次条件的循环
break
例:break命令允许跳出所有循环(终止执行后面的所有循环)。
#!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done
执行以上代码,输出结果为:
输入 1 到 5 之间的数字:3 你输入的数字为 3! 输入 1 到 5 之间的数字:7 你输入的数字不是 1 到 5 之间的! 游戏结束
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
while : 等同于 while true
#!/bin/bash while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。
简单来说就是:
break:跳出所有循环,终止循环!!!
continue:跳出当前循环,跳过循环!!!
# $(seq $num) 等于 ` seq $num ` ; $( 命令 ) ; ${ 变量 } ; [ 表达式/条件 ]
例1:写一个shell菜单
当按数字键4时退出,否则一直循环显示
[root@localhost SHELL]# vim break-continue.sh #!/bin/bash while true do echo "******************************" echo "Please select your operation:" echo "1 Copy" echo "2 Delete" echo "3 Backup" echo "4 Quit" echo "******************************" read op case $op in 1) continue echo "your selection is Copy" ;; 2) echo "your selection is Delete" ;; 3) echo "your selection is Backup" ;; 4) echo "Exit..." break ;; *) echo "选择超出范围,请重新选择!!!" esac done
# 运行结果 [root@localhost SHELL]# bash break-continue.sh ****************************** Please select your operation: 1 Copy 2 Delete 3 Backup 4 Quit ****************************** 1 ****************************** Please select your operation: 1 Copy 2 Delete 3 Backup 4 Quit ****************************** 2 your selection is Delete ****************************** Please select your operation: 1 Copy 2 Delete 3 Backup 4 Quit ****************************** 3 your selection is Backup ****************************** Please select your operation: 1 Copy 2 Delete 3 Backup 4 Quit ****************************** 4 Exit...
例2:使用交互式方法批量添加用户
[root@localhost SHELL]# vim usersadd.sh #!/bin/bash while : do read -p "请输入前缀 & 密码 & 数量:" pre pass num printf "用户信息: ********************** 用户前缀: $pre 用户密码: $pass 用户数量: $num ********************** " read -p "确认创建吗?[y/n]" action if [ $action == y ]; then break fi done for i in `seq $num` do user=$pre$i id $user &> /dev/null if [ $? -ne 0 ]; then useradd $user echo "$pass" | passwd --stdin $user &> /dev/null if [ $? -eq 0 ]; then echo "用户 $user 创建成功!" fi else echo "用户 $user 已存在~" fi done
# 运行结果 [root@localhost SHELL]# bash usersadd.sh 请输入前缀 & 密码 & 数量:shuai 123456 5 用户信息: ********************** 用户前缀: shuai 用户密码: 123456 用户数量: 5 ********************** 确认创建吗?[y/n]n 请输入前缀 & 密码 & 数量:shuai 123456 6 用户信息: ********************** 用户前缀: shuai 用户密码: 123456 用户数量: 6 ********************** 确认创建吗?[y/n]y 用户 shuai1 创建成功! 用户 shuai2 创建成功! 用户 shuai3 创建成功! 用户 shuai4 创建成功! 用户 shuai5 创建成功! 用户 shuai6 创建成功!
Shift参数左移指令
- shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)
- 在扫描处理脚本程序的参数时,经常要用到的shift命令,如果你的脚本需要10个或10个以上的参数,你就需要用shift命令来访问第10个及其后面的参数
作用:每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用
shift 2 一次移动2个参数
sum=$(expr $sum + $1) 等同于 sum=$[$sum+$1]
例子:加法计算器
[root@localhost SHELL]# vim shift.sh #!/bin/bash if [ $# -le 0 ]; then echo "没有足够的参数!" exit fi sum=0 while [ $# -gt 0 ] do sum=$[$sum+$1] shift done echo "相加的结果是:$sum"
# 运行结果 [root@localhost SHELL]# bash shift.sh 没有足够的参数! [root@localhost SHELL]# bash shift.sh 11 22 相加的结果是:33 [root@localhost SHELL]# bash shift.sh 11 22 33 44 55 66 77 88 99 相加的结果是:495
发表评论