Shell学习-11-循环结构(select in、break 、continue)

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 Shell学习-11-循环结构(select in、break 、continue),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

2.30 Shell select in

  • select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景。Shell select in 循环的用法如下:
select variable in value_list
do
    statements
done

variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。

  • select in 循环的例子:
#!/bin/bash
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
echo "You have selected $name"
done
#运行结果
[root@localhost testshell]# . test1.sh
What is your favourite OS?
1) Linux
2) Windows
3) Mac OS
4) UNIX
5) Android
#? 1
You have selected Linux
#? 2
You have selected Windows
#? 3
You have selected Mac OS
#? 9
You have selected 

#?用来提示用户输入菜单编号;^D表示按下 Ctrl+D 组合键,它的作用是结束 select in 循环。

  • 运行到 select 语句后,取值列表 value_list 中的内容会以菜单的形式显示出来,用户输入菜单编号,就表示选中了某个值,这个值就会赋给变量 variable,然后再执行循环体中的 statements(do 和 done 之间的部分)。
  • 每次循环时 select 都会要求用户输入菜单编号,并使用环境变量 PS3 的值作为提示符,PS3 的默认值为#?,修改 PS3 的值就可以修改提示符。
  • 如果用户输入的菜单编号不在范围之内,例如上面我们输入的 9,那么就会给 variable 赋一个空值;如果用户输入一个空值(什么也不输入,直接回车),会重新显示一遍菜单。

注意,select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

  • select in 通常和 case in 一起使用,在用户输入不同的编号时可以做出不同的反应。修改上面的代码,加入 case in 语句:
[root@localhost testshell]# touch test2.sh && vi test2.sh
#!/bin/bash
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
    case $name in
        "Linux")
            echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。"
            break
            ;;
        "Windows")
            echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。"
            break
            ;;
        "Mac OS")
            echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。"
            break
            ;;
        "UNIX")
            echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。"
            break
            ;;
        "Android")
            echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。"
            break
            ;;
        *)
            echo "输入错误,请重新输入"
    esac
done

#运行结果
#用户只有输入正确的编号才会结束循环,如果输入错误,会要求重新输入。
[root@localhost testshell]# . test2.sh
What is your favourite OS?
1) Linux
2) Windows
3) Mac OS
4) UNIX
5) Android
#? 9
输入错误,请重新输入
#? 2
Windows是微软开发的个人电脑操作系统,它是闭源收费的。

2.31 Shell break 和continue

  • 使用 while、until、for、select 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或者 continue 关键字。
  • 在大部分编程语言中,break 和 continue 只能跳出当前层次的循环,内层循环中的 break 和 continue 对外层循环不起作用;但是 Shell 中的 break 和 continue 却能够跳出多层循环,也就是说,内层循环中的 break 和 continue 能够跳出外层循环。

在实际开发中,break 和 continue 一般只用来跳出当前层次的循环,很少有需要跳出多层循环的情况。

2.31.1 break 关键字
  • Shell break 关键字的用法为:
break n

n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。

在这里插入图片描述

  • 不断从终端读取用户输入的正数,求它们相加的和:
#!/bin/bash
sum=0
while read n
do
if((n>0));then
((sum+=n))
else
break
fi
done
echo "The sum is:$sum"
#运行结果:
[root@localhost testshell]# . test3.sh
4
5
3

The sum is:12

while 循环通过 read 命令的退出状态来判断循环条件是否成立,只有当按下 Ctrl+D 组合键(表示输入结束)时,read n才会判断失败,此时 while 循环终止。

除了按下 Ctrl+D 组合键,你还可以输入一个小于等于零的整数,这样会执行 break 语句来终止循环(跳出循环)。

  • 使用 break 跳出双层循环:如果 break 后面不跟数字的话,表示跳出当前循环,对于有两层嵌套的循环,就得使用两个 break 关键字。例如,输出一个 4*4 的矩阵:
#!/bin/bash
i=0
while ((++i)); do  #外层循环
    if((i>4)); then
        break  #跳出外层循环
    fi
    j=0;
    while ((++j)); do  #内层循环
        if((j>4)); then
            break  #跳出内层循环
        fi
        printf "%-4d" $((i*j))
    done
    printf "\n"
done
#运行结果:
[root@localhost testshell]# . test4.sh
1   2   3   4   
2   4   6   8   
3   6   9   12  
4   8   12  16  

当 j>4 成立时,执行第二个 break,跳出内层循环;外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了 4 次,外层循环共执行了 1 次。

  • 也可以在 break 后面跟一个数字,让它一次性地跳出两层循环,请看下面的代码:
#!/bin/bash
i=0
while ((++i)); do  #外层循环
    j=0;
    while ((++j)); do  #内层循环
        if((i>4)); then
            break 2  #跳出内外两层循环
        fi
        if((j>4)); then
            break  #跳出内层循环
        fi
        printf "%-4d" $((i*j))
    done
    printf "\n"
done
  • 修改后的代码将所有 break 都移到了内层循环里面。需要重点关注break 2这条语句,它使得程序可以一次性跳出两层循环,也就是先跳出内层循环,再跳出外层循环
2.31.2 continue关键字
  • Shell continue 关键字的用法为:
continue n
  • n 表示循环的层数:

    • 如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
    • 如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。
  • continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。

在这里插入图片描述

  • 不断从终端读取用户输入的 100 以内的正数,求它们的和:
#!/bin/bash
sum=0
while read n
do
if((n<0||n>100));then
continue
else
((sum+=n))
fi
done
echo "The sum is:$sum"
#运行结果:
[root@localhost testshell]# . test3.sh
1
5
8
111
-2
The sum is:14
#输入111,if 判断条件成立,所以执行了 continue 语句,跳过了当次循环,也就是跳过了((sum+=n))这条语句。
  • 使用 continue 跳出多层循环,请看下面的代码:
#!/bin/bash
for((i=1;i<=6;i++))
do
        for((j=1;j<=6;j++))
        do
                if((i*j==12))
                then
                        continue 2
                fi
                printf "%d*%d=%-4d" $i $j $((i*j))
        done
        printf "\n"
done
#运行结果:
[root@localhost testshell]# . test5.sh
1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   1*6=6   
2*1=2   2*2=4   2*3=6   2*4=8   2*5=10  3*1=3   3*2=6   3*3=9   4*1=4   4*2=8   5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  5*6=30 
6*1=6   
  • 从运行结果可以看出,遇到continue 2时,不但跳过了内层 for 循环,也跳过了外层 for 循环。

  • break 和 continue 的区别:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

参考文献:
Shell select in循环详解

下一篇:Shell学习-12-Shell函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/123682.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!