7.case语句场景示例

Posted 甜甜de微笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.case语句场景示例相关的知识,希望对你有一定的参考价值。

1.实现系统管理工具箱

###################

1.显示磁盘的使用情况   df -h

2.显示内存使用情况   free -m 

3.显示系统负载情况    w    uptime

4.显示CPU使用情况      top    ; htop   ; ps aux

5.查看系统ETH0网卡

6.查看系统外网IP

7.查看系统版本

8.查看系统内核版本

9.退出脚本程序

0.显示帮助菜单

####################

简单版的工具箱

 

 

 

函数版

 

 

 

 

 2.实现简单的Jumpserver(跳板机)

 

 

 

case语句

 

 

 

 

一case条件语句

 

 

case条件语句相当于多分支的if/elif/else条件语句,但是它看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。
 
在case语句中,程序会将case获取的变量的值与表达式部分的值1、值2、值3等逐个进行比较。
 
如果获取的变量值和某个值(例如值1)相匹配,就会执行值(例如值1)后面对应的指令(例如指令1,其可能是一组指令),直到执行到双分号(;;)才停止。
 
然后再跳出case语句主体,执行case语句(即esac字符)后面的其他命令。
 
如果没有找到匹配变量的任何值,则执行"*)"后面的指令(通常是给使用者的使用提示),直到遇到双分号(;;) (此处的双分号可以省略)或esac结束。
 
这部分相当于if多分支语句中最后的else语句部分。
 
另外, case语句中表达式对应值的部分,还可以使用管道等更多功能来匹配。
 

 

 

 

 

 

(一)case语句的语法

 

适合判断变量值


case 变量引用   in
PAT1/值1)
分支1/指令1
;;
PAT2/值2)
分支2/指令2
;;
...
*)
默认分支
;;
esac

 

 

 

case条件语句的执行流程逻辑图:

 

技术图片

 

 

 

 

说明:当变量的值等于值1时,执行指令1;等于值2时执行指令2,以此类推;如果都不符合,则执"*)"后面的指令。
此外,注意不同行内容的缩进距离。
 

 

 

 

 

(二)case支持glob风格的通配符


*: 任意长度任意字符
?: 任意单个字符
[  ]:指定范围内的任意单个字符
a|b: a或b

 

 

 

 

注意变量引用就是带$变量的名称。

如果第1个模式不匹配就继续执行第2个模式的代码。

*相当于else操作,表示的任意的字符串。

满足*就执行默认分支的操作。默认分支后面的两个分号可以不写的。

[[email protected] ~]# type  case 
case is a shell keyword

[[email protected] ~]# help case
case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac   
    Execute commands based on pattern matching.
    
    Selectively execute COMMANDS based upon WORD matching PATTERN.  The
    `| is used to separate multiple patterns.也就是表示或的关系
    
    Exit Status:
    Returns the status of the last command executed.

 

 

 

 

 

 

使用case写脚本判断变量是否是离散值

如果变量num的值是1,2,3那么就执行某个命令cmd1。

如果变量num的值是4,5,6那么就执行某个命令cmd2。

如果变量num的值是7,8,9那么就执行某个命令cmd3

否则就执行其他命令

[[email protected] shell_scripts]# cat  case_1.sh 
#!/bin/bash
#Author=wang
case $num in 
1|2|3)
       echo 1,2,3
       ;;
4|5|6)
       echo 4,5,6
       ;;
7|8|9)
       echo 7,8,9
       ;;
*)
      echo other
esac

 

 

 

 

没有对变量num赋值,所有都显示其他

[[email protected] shell_scripts]# bash case_1.sh   4
other
[[email protected] shell_scripts]# bash case_1.sh   46
other
[[email protected] shell_scripts]# bash case_1.sh   1
other
[[email protected] shell_scripts]# bash case_1.sh   5
other
[[email protected] shell_scripts]# bash case_1.sh   7
other
[[email protected] shell_scripts]# bash case_1.sh   9
other
[[email protected] shell_scripts]# 

 

 

 

 

 

完整脚本

[[email protected] shell_scripts]# cat   case_1.sh 
#!/bin/bash
#Author=wang
read  -p "please input a num: " num
case $num in 
1|2|3)
       echo 1,2,3
       ;;
4|5|6)
       echo 4,5,6
       ;;
7|8|9)
       echo 7,8,9
       ;;
*)
      echo other
esac

 

 

 

 

执行结果

[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 1
1,2,3
[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 3
1,2,3
[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 5
4,5,6
[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 7
7,8,9
[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 9
7,8,9
[[email protected] shell_scripts]# bash   case_1.sh   
please input a num: 11
other

 

 

 

 

 

判断yes或no

完整脚本

[[email protected] shell_scripts]# cat   yesorno_case.sh
#!/bin/bash
#Author=wang
read  -p  "Do you agree?(yes or no): "  ans
case  $ans in
[Yy]|[Yy][Ee][Ss])
     echo yes
     ;;
[Nn]|[Nn][Oo])
     echo no
     ;;
*)
echo other
esac

 

 

 

 

 

 

 执行结果

[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): Y
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): y
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): N
no
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): n
no

 

 

 

 

[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): yes
yes
[[email protected] shell_scripts]# Yes
-bash: Yes: command not found
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): Yes
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): YeS
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): YEs
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): yEs
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): yES
yes
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): yeS
yes

 

 

 

[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): no
no
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): No
no
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): NO      
no
[[email protected] shell_scripts]# bash  yesorno_case.sh
Do you agree?(yes or no): nO
no

 

 

 

 

 

 使用正则表达式判断yes或no

()表示和前面的分开,进行分组

而前面中括号里面的[Yy]是一定有的

?在正则表达式里面表示匹配其前面的字符0 或1次,也就是前面字符可有可无

[[email protected] ~]# ans=yes;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=Yes;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=YEs;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=YES;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=YEs;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=yEs;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes

 

 

 

 

 

[[email protected] ~]# ans=Y;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes
[[email protected] ~]# ans=y;[[ $ans =~ ^[Yy]([Ee][Ss])?$ ]]  &&  echo  yes
yes

 

 

 

[[email protected] ~]# ans=N;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no
[[email protected] ~]# ans=n;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no
[[email protected] ~]# ans=no;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no
[[email protected] ~]# ans=No;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no
[[email protected] ~]# ans=NO;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no
[[email protected] ~]# ans=nO;[[ $ans =~ ^[Nn]([Oo])?$ ]]  &&  echo  no
no

 

 

 

 

 完整脚本

[[email protected] shell_scripts]# cat   yesorno_if.sh
#!/bin/bash
#Author=wang
read -p "do you agree (yes/no):" choice
yes="^[Yy]([Ee][Ss])?$"
#()表示和前面的分开,进行分组
no="^[Nn]([Oo])?$"
if [[ "$choice" =~ $yes ]] ; then
    echo  "you enter yes"
elif [[ "$choice" =~  $no ]] ; then
    echo "you enter no "
else
    echo "enter not a yes or no "
fi

 

 

 

 

 

 执行结果

[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):yes
you enter yes
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):Y
you enter yes
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):y
you enter yes
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):N
you enter no 
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):n
you enter no 
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):nO
you enter no 
[[email protected] shell_scripts]# bash   yesorno_if.sh
do you agree (yes/no):YeS
you enter yes
[[email protected] shell_scripts]# 

 

 

 

 

 

 

 

系统自带的函数是多层嵌套,尽量不要使用嵌套,否则就是给自己挖坑

[[email protected] ~]# declare -f | less

  if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
            if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
                c="BARE:";
            else
                b="GIT_DIR!";
            fi;
        else
            if [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
                if [ -n "$GIT_PS1_SHOWDIRTYSTATE-" ]; then
                    if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
                        git diff --no-ext-diff --quiet --exit-code || w="*";
                        if git rev-parse --quiet --verify HEAD > /dev/null; then
                            git diff-index --cached --quiet HEAD -- || i="+";
                        else
                            i="#";
                        fi;
                    fi;
                fi;

 

以上是关于7.case语句场景示例的主要内容,如果未能解决你的问题,请参考以下文章

RationalDMIS 7.1 CASE分支选择语句之循环选择测量孔

全网最详细中英文ChatGPT-GPT-4示例文档-类比语句智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

for语句

自动化运维必须要学的Shell脚本之——条件语句的详细解读

Shell中if条件语句的知识和实践

python基础-----------条件语句,循环语句