shell编程之八(循环控制符,case分支结构 & select交互式 ·分支|菜单· 结构)

循环控制符(linux的shell编程中,有时需要立即从循环中退出)

break       #跳出当前循环,break 可以跟参数,不带参数只能退出最内层的循环,break N可以退出N层循环
continue    #跳过本次循环,执行下一次循环,continue也可以带参数,不带参数只能跳过本次本层循环,continue 2可以跳过外部循环的下一次循环,但是循环次数不变。

break循环的两个例子

for (( i=1; i<=9; i++  ))
do
    for (( j=1; j<=i; j++  ))
    do
        let "he=i*j"
        if [ "$he" -eq 7 ];then
            break
        fi
        echo -n "$i*$j=$he    "
    done

    echo  ""
done

[root@localhost ~]# sh ceshi.sh 
1*1=1    
2*1=2    2*2=4    
3*1=3    3*2=6    3*3=9    
4*1=4    4*2=8    4*3=12    4*4=16    
5*1=5    5*2=10    5*3=15    5*4=20    5*5=25    
6*1=6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36    

8*1=8    8*2=16    8*3=24    8*4=32    8*5=40    8*6=48    8*7=56    8*8=64    
9*1=9    9*2=18    9*3=27    9*4=36    9*5=45    9*6=54    9*7=63    9*8=72    9*9=81
for (( i=1; i<=9; i++  ))
do
    if [ "$i" -eq 7 ];then
        break
    fi

    for (( j=1; j<=i; j++  ))
    do
        let "he=i*j"
        echo -n "$i*$j=$he    "
    done

    echo  ""
done

[root@localhost ~]# sh ceshi.sh 
1*1=1    
2*1=2    2*2=4    
3*1=3    3*2=6    3*3=9    
4*1=4    4*2=8    4*3=12    4*4=16    
5*1=5    5*2=10    5*3=15    5*4=20    5*5=25    
6*1=6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36

continue例子

for (( i=1; i<=9; i++  ))
do

    for (( j=1; j<=i; j++  ))
    do
        let "he=i*j"
        if [ "$he" -eq 7 ];then
            continue
        fi
        echo -n "$i*$j=$he    "
    done

    echo  ""
done

[root@localhost ~]# sh ceshi.sh 
1*1=1    
2*1=2    2*2=4    
3*1=3    3*2=6    3*3=9    
4*1=4    4*2=8    4*3=12    4*4=16    
5*1=5    5*2=10    5*3=15    5*4=20    5*5=25    
6*1=6    6*2=12    6*3=18    6*4=24    6*5=30    6*6=36    
7*2=14    7*3=21    7*4=28    7*5=35    7*6=42    7*7=49    
8*1=8    8*2=16    8*3=24    8*4=32    8*5=40    8*6=48    8*7=56    8*8=64    
9*1=9    9*2=18    9*3=27    9*4=36    9*5=45    9*6=54    9*7=63    9*8=72    9*9=81 

case 分支结构 及常见用法

即:case (in) / esac 分支结构

case简单用法示例一:判断输入字符类型

#!/bin/bash
# 测试字符串范围.
echo "Hit a key, then hit return."
read Keypress

case "$Keypress" in
  [[:lower:]]   ) echo "$Keypress 是 小写字母";;
  [[:upper:]]   ) echo "$Keypress 是 大写字母";;
  [0-9]         ) echo "$Keypress 是 数字";;
  *             ) echo "$Keypress 是 Punctuation, whitespace, or other";;
esac      #  允许字符串的范围出现在[中括号]中,
          #+ 或者出现在POSIX风格的[[双中括号中.

#+ 测试大写和小写字符串的工作使用的是
#+ [a-z] 和 [A-Z].
#  这种用法在某些特定场合的或某些Linux发行版中不能够正常工作.
#  POSIX 的风格更具可移植性.
#  感谢Frank Wang指出了这点.
exit 0

case简单用法示例二:创建菜单

#!/bin/bash
# 未经处理的地址资料
clear # 清屏.

echo "          Contact List"
echo "          ------- ----"
echo "Choose one of the following persons:" 
echo "[E]vans, Roland"
echo "[J]ones, Mildred"
echo "[S]mith, Julie"

read person

case "$person" in
# 注意, 变量是被""引用的.
  "E" | "e" )
  # 接受大写或者小写输入.
  echo
  echo "Hardscrabble, CO 80753"
  ;;

  "J" | "j" )
  echo
  echo "New York, NY 10009"
  ;;

  # 后边的 Smith 的信息在这里就省略了.
  * )
   # 默认选项.
   # 空输入(敲回车RETURN), 也适用于这里. 
   echo
   echo "Not yet in database."
  ;;

esac
exit 0

case简单用法示例三:使用命令替换来产生"case"变量

#!/bin/bash
# 使用命令替换来产生"case"变量.
case $( arch ) in   
    # "arch" 返回机器体系的类型.
    # 等价于 'uname -m' ...
    i386 )   echo "32 bit machine";;
    x86_64 ) echo "x86_64 bit machine";;
    *    ) echo "Other type of machine";;
esac
exit 0

case简单用法示例四:判断输入参数(比较实用,如写help信息)

#!/bin/bash

case "$1" in
    "" ) echo "对不起,您没有输入任何参数";;
    # 没有命令行参数, 或者第一个参数为空.

    "-h"|"--help" )
    echo "  -v            显示版本"
    echo "  -h | --help   查看帮助"
    echo "  -x            xxxxxxxx"
    ;;

    -* ) echo "这是-开头的参数";;

    * ) echo "对不起,请正确输入参数";;
esac

select 交互式分支结构(用于交互式菜单,它比case多了交互性)

select交换式菜单的格式

select variable in {list}
do
    command
    ........
    break
done

例子一、简单的交互式菜单(输入前面的数字进行选择)

#!/bin/bash

# 注意: select命令使用PS3提示符, 默认为(#?), 当然, 这可以修改。设置提示符字串
PS3='Choose your favorite vegetable: ' 

echo

select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas"
do
  echo
  echo "Your favorite veggie is $vegetable."
  echo "Yuck!"
  echo
  break  # 如果这里没有 'break' 会发生什么? 没有break会一直循环,不会退出
done

exit 0

例子二、设计一个交互式菜单

echo "请输入一个颜色单词"
select color in "red" "black" "green" "white" "blue"
do
    break
done
echo "你输入的颜色是$color"

[root@localhost ~]# sh ceshi.sh 
请输入一个颜色单词
1) red
2) black
3) green
4) white
5) blue
#? 3
你输入的颜色是green
[root@localhost ~]# 

例子三、select 使用函数进行传参

#!/bin/bash

PS3='Choose your favorite vegetable: '

echo

choice_of()
{
select vegetable
# [in list]被忽略, 所以'select'使用传递给函数的参数.
do
  echo
  echo "Your favorite veggie is $vegetable."
  echo "Yuck!"
  echo
  break
done
}

choice_of beans rice carrots radishes tomatoes spinach
#         $1    $2   $3      $4       $5       $6
#         传递给choice_of()的参数

exit 0

### 运行结果如下
root@ser552965470679:~# ./test.sh 

1) beans
2) rice
3) carrots
4) radishes
5) tomatoes
6) spinach
Choose your favorite vegetable: 6

Your favorite veggie is spinach.
Yuck!
声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/518.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2023/5/18作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何? 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录