case ... esac
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
case ... esac 语法格式如下:
case 值 in模式1) command1 command2 ... commandN ;;模式2) command1 command2 ... commandN ;;esac
case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入 1 到 4,与每一种模式进行匹配:
实例
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
输入不同的内容,会有不同的结果,例如:
输入 1 到 4 之间的数字:你输入的数字为:3你选择了 3
下面的脚本匹配字符串:
实例
site="runoob"
case "$site" in
"runoob") echo "菜鸟教程"
;;
"google") echo "Google 搜索"
;;
"taobao") echo "淘宝网"
;;
esac
输出结果为:
菜鸟教程
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
实例
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
执行以上代码,输出结果为:
输入 1 到 5 之间的数字:3你输入的数字为 3!输入 1 到 5 之间的数字:7你输入的数字不是 1 到 5 之间的! 游戏结束
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
实例
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "游戏结束" 永远不会被执行。


情空明月
moo***v@gmail.com
shell 中的 for 循环不仅可以用文章所述的方法。
对于习惯其他语言 for 循环的朋友来说可能有点别扭。
如上所示,这里的 for 循环与 C 中的相似,但并不完全相同。
通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:
执行结果:
与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。
情空明月
moo***v@gmail.com
This_Is_Y
Thi***s_Y@qq.com
参考地址
从 ubuntu 6.10 开始,ubuntu 就将先前默认的 bash shell 更换成了dash shell,其表现为 /bin/sh 链接倒了 /bin/dash 而不是传统的 /bin/bash。
可以通过 ls -l /bin/*sh 命令看到:
所以在使用 sh 命令执行脚本的时候实际使用的是 dash,而 dash 不支持这种 C 语言格式的 for 循环写法。
解决方法:使用 bash 代替 sh 运行脚本:
This_Is_Y
Thi***s_Y@qq.com
参考地址
风鹏正举
cle***@126.com
如果 for 循环是按 1 递增的,可以利用 seq 命令来生成数字系列,参考写法如下:
执行结果:
在某些情况下比使用 while 更加方便。
风鹏正举
cle***@126.com
開色
wrd***main@163.com
test 命令和 [ 底层是一个命令, [ 是一个命令,会自动检测右中括号 ],通过 which [ 查看 Linux 中命令的位置,test 不会自动检测右中括号 ] 。
[ 底层使用 c/c++ 编写的可以看它的源码:https://github.com/freebsd/freebsd-src/blob/master/bin/test/test.c。
[[ 是 bash shell 环境自己实现的判断方式,比 [ 更安全,例如:
1. [ 不能识别 $var 变量值
2. [ 会把大于号、小于号识别为重定向符号,把 a 当成文件输入输出
[ 相比于 [[ 的一个优点,应该是 bash shell 环境自己实现的 [[ 在其他 shell 环境不能兼容,所以 [ 有更好的可移植性。
详情可以看:
http://mywiki.wooledge.org/BashGuide/Practices#Bash_Tests
https://zhuanlan.zhihu.com/p/136591210
開色
wrd***main@163.com