老男孩shell运维实战例题说明
背景知识:双中括号[[]]
①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]],如果不适用双括号,则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
例子:
if($i<5) if[$i-lt5] if[$a-ne1-a$a!=2] if[$a-ne1]&&[$a!=2] if[[$a!=1&&$a!=2]] foriin$(seq04);doecho$i;done foriin`seq04`;doecho$i;done for((i=0;i<5;i++));doecho$i;done foriin{0..4};doecho$i;done
老男孩书中例题如下:
#!/bin/sh cat<<END 1.panxiaoting 2.gongli 3.fanbingbing END read-p"Whichdoyoulike?,Plsinputthenum:"a ["$a"="1"]&&{ echo"Iguess,youlikepanxiaoting" exit1 } ["$a"="2"]&&{ echo"Iguess,youlikegongli" exit1 } ["$a"="3"]&&{ echo"Iguess,youlikefangbingbing" exit1 } [[!"$a"=~[1-3]]]&&{###支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式 echo"Iguess,youarenotman." }
说明:
其中[[ ! "$a" =~ [1-3] ]]可以替换成[ "$a" != "1","2","3" ]或[[ "$a" != "1","3" ]]