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

Bri*_*ter 3 bash

我发现了一个漂亮的小shell脚本,我想在这里使用这个网站.我一步一步地遵循了所有步骤,但在我的CentOS盒子上运行时收到以下错误.

./deploy: line 3: =: command not found
Run Code Online (Sandbox Code Playgroud)

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

$ERRORSTRING = "Error. Please make sure you've indicated correct parameters"
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Gor*_*son 10

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

$ERRORSTRING = "Error. Please make sure you've indicated correct parameters"
Run Code Online (Sandbox Code Playgroud)

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

ERRORSTRING="Error. Please make sure you've indicated correct parameters"
Run Code Online (Sandbox Code Playgroud)

下面几行(并且接近尾声),我们有:

echo $ERRORSTRING;
Run Code Online (Sandbox Code Playgroud)

... 有效,但包含两个不好的想法:一个没有双引号的变量引用(有时会以意想不到的方式解析),以及行尾的分号(这是某人正在尝试的标志)在shell脚本中编写C或Java或其他东西).请改用:

echo "$ERRORSTRING"
Run Code Online (Sandbox Code Playgroud)

下一行是:

elif [ $1 == "live" ]
Run Code Online (Sandbox Code Playgroud)

... 可能有效,取决于$1具有空格的值,还是已定义但空白,或类似的任何内容(同样,使用双引号来防止误解!).此外,==比较运算符是非标准的 - 它可以工作,因为bash在其[ ... ]内置语法中支持它,但如果你指望有bash扩展可用,为什么不使用更干净的[[ ... ]]替换?这些中的任何一个都是该行的更好替代品:

elif [ "$1" = "live" ]
elif [[ $1 == "live" ]]
elif [[ "$1" == "live" ]]
Run Code Online (Sandbox Code Playgroud)

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

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


Bri*_*ter 6

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

ERRORSTRING="Error. Please make sure you've indicated correct parameters"
Run Code Online (Sandbox Code Playgroud)

我赞成了Devnull和gniourf_gniourf的评论.

感谢所有协助的人!