在shell中case...esac循环和if else ... elif...else用法类似,都是去和每个条件语句进行判断,直到碰到符合的判断条件就结束循环,在case...esac中,"需要满足的值"后面必须跟着单词 in,每个判断条件必须以右括号结束,;;可以理解成break,跳出循环。匹配发现取值符合判断条件后,开始执行其子代码模块直至碰到 ;;结束循环。如果所有判断条件都不符合,则走到 *的判断条件中,执行*的判断条件。
先看下基本用法:
case 需要满足的值 in #这里设置一个需要满足的条件
判断条件1) #判断条件1,判断该条件是否符合需要满足的值
子模块 #如果判断条件为 true,执行子模块1
;; #结束整个循环
判断条件2) #如果判断条件1没满足需要满足的值,则走到判断条件2,判断该条件是否符合需要满足的值
子模块2 #如果判断条件为 true,执行子模块2
;; #结束整个循环
判断条件3) #如果判断条件2没满足需要满足的值,则走到判断条件3,判断该条件是否符合需要满足的值
子模块3 #如果判断条件为 true,执行子模块3
;; #结束整个循环
……
*) #如果之前的判断条件都没满足需要满足的值,则走到判断条件*
子模块4 #走到判断条件*后,不管有没有满足都会执行下面的子模块
;; #结束整个循环
esac #结束语法
看个具体实例:
#!/bin/bash
echo "输入一个1-3的值" #打印 输入一个1-3的值
read num #读取输入的值num
case $num in #给num设定值为输入的num
1) #判断 当输入的值为1时,走到1的子代码模块中
echo "输入的值为1" #打印 输入的值为1
;; #结束整个循环
2) #判断 当输入的值为2时,走到2的子代码模块中
echo "输入的值为2" #打印 输入的值为2
;; #结束整个循环
3) #判断 当输入的值为3时,走到3的子代码模块中
echo "输入的值为3" #打印 输入的值为3
;; #结束整个循环
*) #当上述所有判断条件都不满足时,走到*的代码模块中
echo "输入的值是其他" #打印 输入的值是其他
;; #结束整个循环
esac #结束的语法
下面看下各项的输入结果:
可以看出当输入1时因为满足条件的1判断条件所以就直接走到了条件1的子代码模块中,直接结束循环不走后面的流程了
当输入为2时,因为不满足判断条件1,所以继续往下走到判断条件2,发现满足判断条件2,则走到条件2的子代码模块中,直接结束循环不走后面的流程了
当输入为3时,因为不满足判断条件1,所以继续往下走到判断条件2,发现仍不满足判断条件2,所以继续往下走到判断条件3,发现满足判断条件3,则走到条件3的子代码模块中,直接结束循环不走后面的流程了
当输入为5时,首先因为不满足判断条件1,所以继续往下走到判断条件2,发现仍不满足判断条件2,所以继续往下走到判断条件3,发现还不满足判断条件3,则走到*的子代码模块中,执行*的子代码模块,结束整个循环。
稍微改下判断条件,使其满足多个判断条件,看看会不会走到多个条件分支去。
#!/bin/bash
echo "输入一个1-3的值" #打印 输入一个1-3的值
read num #读取输入的值num
case $num in #给num设定值为输入的num
1) #判断 当输入的值为1时,走到1的子代码模块中
echo "输入的值为1" #打印 输入的值为1
;; #结束整个循环
2) #判断 当输入的值为2时,走到2的子代码模块中
echo "输入的值为2" #打印 输入的值为2
;; #结束整个循环
2) #判断 当输入的值为3时,走到3的子代码模块中
echo "第二个判断条件也是2" #打印 第二个判断条件也是2
;; #结束整个循环
*) #当上述所有判断条件都不满足时,走到*的代码模块中
echo "输入的值是其他" #打印 输入的值是其他
;; #结束整个循环
esac #结束的语法
看下输入2时,会走到那个分支里:
这样来看是走到第1个2的时候就直接停止了循环,没有再去往下走去进行条件判断了。
case...esca和python的if...esif...else一样,整体流程就是先找一个需要满足的值,然后由上到下去和下面的各个判断进行对比,如果满足了任意判断条件,则进入到对应的子代码模块中,如果都不满足,则走到最后的*条件句中,执行*的子代码模块,然后结束整个循环。如果满足了其中多个判断条件,则由上到下,走到第一个满足的条件时,去执行他的子代码模块,然后结束循环。