为什么在测试命令中排除[]不会停止脚本执行?

时间:2019-04-25 01:24:32

标签: linux bash

我有一个如下的Bash脚本。

#!/bin/bash
if [ "1" -eq "1"
then echo "something"
else echo "some other thing"
fi

执行脚本时,得到以下输出

test.sh: line 2: [: missing `]'
some other thing

这对我来说尚不清楚,因为我除了脚本退出外还出现错误。如果这是预期的行为,可以更详细地解释吗?

但是,当我使用复合命令[[

#!/bin/bash
if [[ "1" == "1"
then echo "something"
else echo "some other thing"
fi

我确实得到了错误,脚本停止了进一步执行。

test.sh: line 2: syntax error in conditional expression
test.sh: line 3: syntax error near `then'
test.sh: line 3: `then echo "something"'

2 个答案:

答案 0 :(得分:3)

[不是bash语法,它只是一个命令(具有shell内置实现的命令可用于性能优化,是的,但是具有与标准{{1}相同的解析时行为) }外部实现或任何其他命令)。将无效的/bin/[命令或无效的ping命令放在同一位置也不会使脚本的语法无效。

相比之下,grep 的实际语法,这就是使其在[[之上具有特征的原因(a set which includes识别模式而不将其扩展为glob,抑制字符串拆分和全局扩展,使[&&用于合并测试等成为可能,并且还使无效用法能够引起解析错误。


如果要减少读者的困惑,请考虑使用名称||代替test。尽管[[通常是同一命令的别名(行为上唯一的区别是是否需要test),但从视觉上看,读者更加清楚]正在运行名为if test 1 -eq 1; then的命令,而不是某种特殊的Shell语法。

答案 1 :(得分:1)

$ type [[ [
[[ is a shell keyword
[ is a shell builtin

[是普通的内置文件。 [[是一个shell关键字,它具有特殊的语法含义(例如,变量不进行单词拆分)。因此,[[的无效用法可能是解析错误,从而阻止了脚本的正确解析,而[的相似用法只是内建函数返回一个非零退出代码,并可能存在一些错误。输出。与false返回非零退出代码相比,它对shell的影响不大。

相关问题