除了我们很喜欢使用的 test 之外,其实,我们还可以利用判断符号『 [ ] 』(就是中括号啦) 来进行数据的判断呢! 举例来说,如果我想要知道 $HOME 这个变量是否为空的,可以这样做:
[oracle@SOR_SYS]$ [ -z "$HOME" ] ; echo $?
1
使用中括号必须要特别注意,因为中括号用在很多地方,包括万用字节与正规表示法等等,所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字节来分隔喔!
[ "$HOME" == "$MAIL" ]
[□"$HOME"□==□"$MAIL"□]
↑ ↑ ↑ ↑
Tips:
你会发现在上面的判断式当中使用了两个等号『 == 』。其实在 bash 当中使用一个等号与两个等号的结果是一样的! 不过在一般惯用程序的写法中,一个等号代表『变量的配置』,两个等号则是代表『逻辑判断 (是否之意)』。 由於我们在中括号内重点在於『判断』而非『配置变量』,因此鸟哥建议您还是使用两个等号较佳!
上面的例子在说明,两个字串 $HOME 与 $MAIL 是否相同的意思,相当於 test $HOME = $MAIL 的意思啦! 而如果没有空白分隔,例如 [$HOME==$MAIL] 时,我们的 bash 就会显示错误信息了!这可要很注意啊! 所以说,你最好要注意:
- 在中括号 [] 内的每个组件都需要有空白键来分隔;
- 在中括号内的变量,最好都以双引号括号起来;
- 在中括号内的常数,最好都以单或双引号括号起来。
为什么要这么麻烦啊?直接举例来说,假如我配置了 name="Zhu Ying" ,然后这样判定:
[oracle@99bill-as9 zy]$ name="Zhu Ying"
[oracle@99bill-as9 zy]$ [ $name == "Ying" ]
-bash: [: too many arguments
why?因为 $name 如果没有使用双引号刮起来,那么上面的判定式会变成:
[ Zhu Ying== "Ying" ]
上面肯定不对嘛!因为一个判断式仅能有两个数据的比对,上面 Zhu与 Ying还有 "Ying" 就有三个数据! 这不是我们要的!我们要的应该是底下这个样子:
[ "Zhu Ying" == “Ying” ]
这可是差很多的喔!另外,中括号的使用方法与 test 几乎一模一样啊~ 只是中括号比较常用在条件判断式 if ..... then ..... fi 的情况中就是了。 好,那我们也使用中括号的判断来做一个小案例好了,案例配置如下:
- 当运行一个程序的时候,这个程序会让使用者选择 Y 或 N
- 如果使用者输入 Y 或 y 时,就显示『 OK, continue 』
- 如果使用者输入 n 或 N 时,就显示『 Oh, interrupt !』
- 如果不是 Y/y/N/n 之内的其他字节,就显示『I don't know what your choice is 』
利用中括号、 && 与 || 来继续吧!
vi judgment.sh
#!/bin/bash
#This program shows the user's choice
read -p "Please input (Y/N):" yn
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
[ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what your choice is! " && exit 0
测试:
[oracle@SOR_SYS]$ sh judgment.sh
Please input (Y/N):y
OK,continue
[oracle@SOR_SYS]$ sh judgment.sh
Please input (Y/N):n
Oh,interrupt!
[oracle@SOR_SYS]$ sh judgment.sh
Please input (Y/N):
I don't know what your choice is!
[oracle@SOR_SYS$
由於输入正确 (Yes) 的方法有大小写之分,不论输入大写 Y 或小写 y 都是可以的,此时判断式内就得要有两个判断才行! 由于是任何一个成立即可 (大小或小写的 y) ,所以这里使用 -o (或) 连结两个判断喔! 很有趣吧!利用这个字串判别的方法,我们就可以很轻松的将使用者想要进行的工作分门别类呢! 接下来,我们再来谈一些其他有的没有的东西吧!
======================================================
上面的脚本我们可以改成if。。。then判断语句
#!/bin/bash
read -p "Please input (Y/N)" yn
if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
echo "OK,continue!"
exit 0
fi
if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
echo "Oh,intrrupt!"
exit 0
fi
echo "I don't know what your choice is " && exit 0
测试结果:
[oracle@SOR_SYS~]$ sh if-judg.sh
Please input (Y/N)y
OK,continue!
[oracle@SOR_SYS~]]$ sh if-judg.sh
Please input (Y/N)n
Oh,intrrupt!
[oracle@SOR_SYS~]]$ sh if-judg.sh
Please input (Y/N)
I don't know what your choice is