Shell test字符串比较恒为真的bug

这个bug说大不大,说小不小,但是很烦人。第一天写shell就搞出这种问题来……其实说穿了还是shell对空格的要求很高。接触的上一个对空格要求这么高的语言是Python,那个就不谈了。

环境是RHEL8。具体情况是这样的:

[ 'abcd'!='abcd' ]
echo $?
# 0

理论上应该输出1(假)才对,这两个字符串明明是完全相同的。一开始我觉得是不是堆引用的问题,比如字符串常量引用了堆里的不同位置,后来想起来好像Shell里没堆的概念……那肯定不是这个问题了。

后来发现,shell里的命令和变量对空格的要求是不一样的。命令周围必须有空格。比如,上面的代码应该改成这样:

[ 'abcd' != 'abcd' ]
echo $?
# 1

!=作为一个事实上的命令,周围是必须有空格的,否则会被当成一个常量(赋值给一个匿名变量?)。而对常量执行test的结果是恒为0(也就是说,恒为真)的,也就有了上面出现的情况。

变量赋值不能有空格,否则会被当成命令执行。也就是说,下面的代码是错误的:

abcd = 'abcd'
# bash: abcd: command not found...

事实上应该把空格去掉,写成这样:

abcd='abcd'
echo ${abcd}
# abcd

恕我直言,Shell的可读性是真的差。不过,能感觉到现代语言从里面借鉴的语法。比如这个${},ES6里引入的模板字符串语法就是来源于此吧,还是挺有意思的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值