错误:=:找不到命令(Bash脚本)

时间:2014-04-14 16:48:53

标签: bash

我发现了一个漂亮的小shell脚本,我想在this website here.中使用我已逐步完成所有操作,但在我的CentOS盒子上运行时会收到以下错误。

./deploy: line 3: =: command not found

第3行只包含......

$ERRORSTRING = "Error. Please make sure you've indicated correct parameters"

我尝试了一下,但不明白为什么它不会接受“=”字符。脚本是否有问题,或者仅仅是我的服务器处理脚本的方式不同?

谢谢!

2 个答案:

答案 0 :(得分:9)

Gah,这个脚本充满了糟糕的脚本编写实践(除了你遇到的直接错误)。这是彻头彻尾的错误:

$ERRORSTRING = "Error. Please make sure you've indicated correct parameters"

正如devnull所指出的,这应该是:

ERRORSTRING="Error. Please make sure you've indicated correct parameters"

几行(并且接近结尾),我们有:

echo $ERRORSTRING;

... 工作,但包含两个不好的想法:一个没有双引号的变量引用(有时会以意想不到的方式解析),并且在结尾处有一个分号line(这是某人试图在shell脚本中编写C或Java或其他内容的标志)。请改用:

echo "$ERRORSTRING"

下一行是:

elif [ $1 == "live" ]

...哪些可能工作,具体取决于$1的值是否有空格,或者是否已定义但空白,或类似的任何内容(同样,使用双引号)防止误解!)。此外,==比较运算符是非标准的 - 它会起作用,因为bash以[ ... ]内置语法支持它,但是如果你指望有bash扩展可用,那么为什么不使用更清晰的{{{ 1}}替换?任何这些都可以更好地替代这一行:

[[ ... ]]

就个人而言,我更喜欢最后一个。在这种特殊情况下不需要双引号,但IMO最安全的是只引用所有变量引用,除非有特殊原因不这样做。更进一步,有一个elif [ "$1" = "live" ] elif [[ $1 == "live" ]] elif [[ "$1" == "live" ]] ,相同的评论适用于。

BTW,www.shellcheck.net有一个很好的shell脚本健全检查工具。它并不像我那样挑剔(例如它没有在行的末尾标记分号),但是它指出了这个脚本中的所有实际错误......

答案 1 :(得分:5)

“Devnulls”答案是正确的 - 我必须删除“=”周围的空格,并从该行中删除“$”。最终结果是......

ERRORSTRING="Error. Please make sure you've indicated correct parameters"

我赞成了Devnull和gniourf_gniourf的评论。

感谢所有协助的人!