2014-04-14 213 views
1

我发现,我想从this website here.我按照一切用一个漂亮的小shell脚本一步一步,但在我的CentOS的机器上运行这个时收到以下错误。错误:=:找不到命令(bash脚本)

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

3号线仅包含...

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

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

谢谢!

+3

'='符号周围有空格。读取相应的行为'$ ERRORSTRING =“错误。请确保您已经指出了正确的参数”'',在'='符号周围没有空格。 –

+2

(1)删除'='周围的空格。 (2)分配一个变量时,不要使用'$'(在LHS上)。 – devnull

+0

'ERRORSTRING =“错误,请确保你已经指出了正确的参数”' – devnull

回答

5

“Devnulls”的答案是正确的 - 我不得不删除围绕“=”的空间,并删除该行的“$”为好。最终结果是...

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

我已经upvoted Devnull和gniourf_gniourf的评论。

谢谢所有帮助过的人!

7

尔加,该脚本是充满了不好的脚本行为(除了你正在运行到完全错误)。下面是彻底错误:

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

由于devnull指出,这应该是:

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

几行下(并再次接近尾声),我们有:

echo $ERRORSTRING; 

...这工作,但包含了两个不好的想法:没有用双引号(这有时会以意想不到的方式进行解析)可变参考,并分号在行尾(这是某人试图在shell脚本中编写C或Java或其他东西的标志)。使用这个来代替:

echo "$ERRORSTRING" 

的下一行是:

elif [ $1 == "live" ] 

...这威力工作,取决于$1值是否有空格,或者被定义,但是空白,或类似的东西(再次,使用双引号来防止误解!)。此外,==比较操作是非标准的 - 它会工作,因为bash的支持在其[ ... ]内置语法,但如果你在具有bash的扩展可用计数,为什么不使用更清洁的替代[[ ... ]]?任何这些将是更好的替代该行:

elif [ "$1" = "live" ] 
elif [[ $1 == "live" ]] 
elif [[ "$1" == "live" ]] 

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

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