我有一个如下的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"'
答案 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的影响不大。