22-Linux-shell脚本进阶篇(二)

mac2024-04-10  28

shell脚本进阶篇(二)

文章目录

while的简略用法while的特殊用法一 :while的特殊用法二 : until的简略用法循环控制语句select循环与菜单跳至文章尾部


while的简略用法

格式 :

while CONDITION;do 循环体 done
CONDITION:循环控制条件;CONDITION一般都有循环控制变量;此变量的值会在循环体中不断的被修正进入条件 :CONDITION为true退出条件 :CONDITION为false

while的特殊用法一 :

死循环

while :;do 循环体 done

while的特殊用法二 :

从文件中每次读入一行作为LINE的参数

while read LINE;do done < /PATH/TO/SOMEFILE

示例 :

计算1至100的和

[root@CentOS7 data]# vim sum_while.sh #!/bin/bash sum=0 i=1 while [ $i -le 100 ];do let sum+=i let i++ done echo sum=$sum #运行脚本 [root@CentOS7 data]# sh sum_while.sh sum=5050

打印一个国际象棋棋盘

[root@CentOS7 data]# vim big_chess_while.sh #!/bin/bash i=1 BEGIN='\033[1;' RED=41m YELLOW=43m flag=true while [ $i -le 8 ];do if $flag;then j=1 while [ $j -le 4 ];do echo -e "${BEGIN}${RED} ${BEGIN}${YELLOW} \c" let j++ done flag=false else j=1 while [ $j -le 4 ];do echo -e "${BEGIN}${YELLOW} ${BEGIN}${RED} \c" let j++ done flag=true fi echo -e "\e[0m" let i++ done [root@CentOS7 data]# sh big_chess_while.sh #运行脚本结果暂不展示

读入一个文件

[root@CentOS7 data]# echo {1..100} > name.txt [root@CentOS7 data]# vim name_while.sh #!/bin/bash while read LINE;do NUM=`echo $LINE |tr ' ' '+' |bc` echo num=$NUM done < /data/name.txt [root@CentOS7 data]# sh name_while.sh num=5050

until的简略用法

格式 :

until CONDITION; do 循环体 done

进入条件: CONDITION 为false

退出条件: CONDITION 为true

示例 :

[root@CentOS7 data]# vim do_you_like_me.sh #!/bin/bash read -p "Do you like me ? [y/n]: " ANS until [ "$ANS" == y ];do sleep 1 read -p "Do you like me ? [y/n]: " ANS if [ "$ANS" == y ];then echo "You are really!" fi done [root@CentOS7 data]# sh do_you_like_me.sh Do you like me ? [y/n]: y [root@CentOS7 data]# sh do_you_like_me.sh Do you like me ? [y/n]: n Do you like me ? [y/n]: n ................. Do you like me ? [y/n]: y You are really! [root@CentOS7 data]#

循环控制语句

循环控制语句continue

循环控制语句break

continue :提前结束本轮循环,进入下一轮判断;break:提前结束循环 ;

continue与break的区别 :前者仅退出循环体中的一次循环,但后续参数依旧正常循环运行。后者则是直接结束该循环体,后续参数不再继续执行;

格式 :

continue :

while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done

break :

while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done

示例 :

打印1至10

[root@CentOS7 data]# vim contiue.sh #!/bin/bash for ((i=0;i<10;i++));do if [ $i -eq 5 ];then continue fi echo $i |tr '\n' ' ' done [root@CentOS7 data]# sh contiue.sh 0 1 2 3 4 6 7 8 9

显然这跳过了数字 5 ,但后续循环并未停止


continue嵌套,二层循环

[root@CentOS7 data]# vim continue_two.sh #!/bin/bash for ((i=0;i<3;i++));do for ((j=0;j<10;j++));do if [ $j -eq 5 ];then continue 2; #数字 2 表示指定第二层循环语句 fi echo j=$j|tr '\n' ' ' done echo i=$i|tr '\n' ' ' done [root@CentOS7 data]# sh continue_two.sh j=0 j=1 j=2 j=3 j=4 j=0 j=1 j=2 j=3 j=4 j=0 j=1 j=2 j=3 j=4

显然这也同样跳过了数字 5 ,但这是两层循环,循环次数为 :一层循环参量个数 X 二层循环参量个数


以上面的例子适当改动,使用break来测试

[root@CentOS7 data]# vim break.sh #!/bin/bash for ((i=0;i<10;i++));do if [ $i -eq 5 ];then break; fi echo i=$i|tr '\n' ' ' done [root@CentOS7 data]# sh break.sh i=0 i=1 i=2 i=3 i=4

虽然循环并未全部完成,但break满足条件后将直接退出循环,后续循环将终止(不再执行)


brake嵌套,二层循环

[root@CentOS7 data]# vim break_two.sh #!/bin/bash for ((i=0;i<3;i++));do for ((j=0;j<10;j++));do if [ $j -eq 5 ];then break 2; #数字 2 表示指定第二层循环语句 fi echo j=$j|tr '\n' ' ' done echo i=$i|tr '\n' ' ' done [root@CentOS7 data]# sh break_two.sh j=0 j=1 j=2 j=3 j=4

由此可以看出,只要循环语句中出现 continue 或 break,当条件被满足时,被指定的循环层将直接受其影响;

结论:

continue:仅退出循环中满足条件的一次; break:直接结束整个循环;
循环控制语句 shiftshift :用于将参量列表list左移指定次数,缺省为左移一次 参量列表list一旦被移动,最左侧的参数将从列表中删除;while循环遍历位置参量列表时常用到shift

示例 :

打印一串数字

[root@CentOS7 data]# vim num_shift.sh #!/bin/bash while [ "$1" ];do echo num=$1|tr '\n' ' ' shift done [root@CentOS7 data]# sh sh num_shift.sh {1..3} num=1 num=2 num=3 [root@CentOS7 data]# sh num_shift.sh {1..3}{a..c} num=1a num=1b num=1c num=2a num=2b num=2c num=3a num=3b num=3c

select循环与菜单

格式 :

select variable in list do 循环体 done

select 循环主要用于创建菜单,按数字顺序进行排列的菜单显示在标准错误上,同时显示PS3提示符,等待用户输入

select 是个死循环,因此需配合使用break命令退出循环,或使用exit 命令终止脚本,亦可按Ctrl + C 退出循环

select 常与case 组合使用

可省略in list ,使用位置参量

示例 :

中午去吃饭,给我炒一本

[root@CentOS7 data]# vim menu_select.sh #!/bin/bash cat <<! 1) 北京烤鸭 2) 佛跳墙 3) 麻辣小龙虾 4) 羊蝎子 5) 麻辣香锅 6) 点菜结束 ! sum=0 while read -p "Please select your menu (1-6): " MENU;do case $MENU in 1) echo The Price is 99¥ let sum+=99 ;; 2) echo The Price is 399¥ let sum+=399 ;; 3) echo The Price is 120¥ let sum+=120 ;; 4) echo The Price is 149¥ let sum+=149 ;; 5) echo The Price is 299¥ let sum+=299 ;; 6) echo -e "\033[32m点菜结束.\033" echo -e "\033[33mPrice : ${sum}¥.\033" break ;; *) echo "该菜品尚未添加,请重新选择." esac done #运行脚本 [root@CentOS7 data]# sh menu_select.sh 1) 北京烤鸭 2) 佛跳墙 3) 麻辣小龙虾 4) 羊蝎子 5) 麻辣香锅 6) 点菜结束 Please select your menu (1-6): 1 The Price is 99¥ Please select your menu (1-6): 3 The Price is 120¥ Please select your menu (1-6): 5 The Price is 299¥ Please select your menu (1-6): 7 该菜品尚未添加,请重新选择. Please select your menu (1-6): 4 The Price is 149¥ Please select your menu (1-6): 6 点菜结束. Price : 667¥. [root@CentOS7 data]#

使用select 自动生成菜单

[root@CentOS7 data]# vim menu_select_two.sh #!/bin/bash PS3="Please start ordering [y] :" select MEUN in 麻辣香锅 北京烤鸭 佛跳墙 麻辣小龙虾 羊蝎子 点菜结束 do while read -p "Please select your menu (1-6): " MEUN;do case $MEUN in 1) echo The Price is 99¥ let sum+=99 ;; 2) echo The Price is 399¥ let sum+=399 ;; 3) echo The Price is 120¥ let sum+=120 ;; 4) echo The Price is 149¥ let sum+=149 ;; 5) echo The Price is 299¥ let sum+=299 ;; 6) echo -e "\033[32m点菜结束.\033" echo -e "\033[33mPrice : ${sum}¥.\033" break 2 ;; *) echo "该菜品尚未添加,请重新选择." esac done done #运行脚本 [root@CentOS7 data]# sh menu_select_two.sh 1) 麻辣香锅 3) 佛跳墙 5) 羊蝎子 2) 北京烤鸭 4) 麻辣小龙虾 6) 点菜结束 Please start ordering [y] :y Please select your menu (1-6): 3 The Price is 120¥ Please select your menu (1-6): 7 该菜品尚未添加,请重新选择. Please select your menu (1-6): 1 The Price is 99¥ Please select your menu (1-6): 6 点菜结束. Price : 219¥. [root@CentOS7 data]#

跳至文章尾部

最新回复(0)