Shell 脚本中中括号“[]”判断问题

问题描述

在用“[]”测试的时候,由于不知道什么原因,判断的结果总为真。
例如:

[ "$choice"=="n" -o "$choice"=="N" ] && echo -e "Oh interrupt!" && exit 0

无论变量“choice”是什么内容,测试总为然后输出后面的内容。

问题原因

然后查阅资料,发现原因。
在bash的语法中使用中括号作为shell的判断式时,中括号的两端必须要有空格符来分隔,并且在中括号[]内的每个组件都需要有空格键来分隔。
所以正确的写法应该是

  [ "$choice" == "n" -o "$choice" == "N" ] && echo -e "Oh interrupt!" && exit 0

即“==”两边要加上空格符号,这样子就能够判断正确了。
同样,在“[[ exp ]]”判断中,组件之间也要加上空格来分隔,才能够取得正确结果。

延伸阅读

单中括号 []

  1. shell中的“[]”判断与test的使用方法几乎一模一样。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。
  2. Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。“&&”与“||”都是无法使用的。
  3. 在中括号判断中的常量都最好使用单引号或者双引号括起来,而变量最好使用双引号括起来。
  4. 中括号“[]”判断时“==”与“=”的结果是一样的,如
[ "$choice" == "n" -o "$choice" == "N" ]

[ "$choice" = "n" -o "$choice" = "N" ]

结果相同。

双中括号[[ ]]

  1. [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
  2. 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
  3. 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
  4. bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

参考文献

  1. 《鸟哥的linux私房菜》第三版
  2. shell中的括号(小括号,中括号,大括号)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值