2013-06-11 40 views
1

编辑:变量W /空格+ SSH

它出现在我的首要问题是通过对每一个迭代循环处理“字”是在远程主机上空。 COLORS变量在我回显时看起来很好,它显示了所有四种颜色。

我有一个bash脚本使用FOR循环通过ssh这样调用:

ssh [email protected] <<EOF 

COLORS=RED GREEN WHITE ORANGE 

for word in $COLORS; do 
echo $word 
done 

exit 
EOF 

我的输出看起来像这样但是:

ORANGE 
ORANGE 
ORANGE 
ORANGE 

for循环标识4空间delmited ARGS在COLOURS变量,因为它循环并回声4次,它只显示最后一个参数ORANGE。我可以改变什么,以便每个参数都得到回应?

+2

关于改变'COLORS什么=红色绿色白色ORANGE'到'颜色= “红色绿色白橙”'? – fedorqui

+0

,似乎没有工作,我得到这个错误:“回声ORANGE:没有这样的文件或目录” – gjw80

回答

4

2个问题:

  1. 各地变量赋值把双引号: COLORS="RED GREEN WHITE ORANGE"
  2. 在HEREDOC使用时逃离$

下面的代码工作:

ssh [email protected] <<EOF 

COLORS="RED GREEN WHITE ORANGE" 

for word in \$COLORS; do 
echo \$word 
done 

EOF 

我也是从它去掉了非必要的退出声明。

+0

对我不起作用,变量未在脚本中声明。它们被设置在被注入到构建中的属性文件中。脚本/变量在没有ssh的情况下运行正常,但在其内部导致问题。 – gjw80

+0

好的...我的回答是基于你输入的任何脚本:-)除非你给你使用的“属性文件机制”,否则我将无法更新答案... – anishsane

+0

我的解决方案是改变变量在FOR循环中的名称与转义$一起使用。在使用'word'时,看起来像ORANGE仍然保存在本地host01上的第一次迭代中,当我更改为'arg',然后在ssh会话中按照预期工作时转义$。谢谢! – gjw80

0

放“”周围的颜色 原因在这一点上,我认为它看到的颜色变量=橙色。这是我的猜测,因为for循环很好。

+0

的变量或值? – gjw80

+0

COLORS =“RED GREEN WHITE ORANGE” – Franko

4

你需要保护$COLORS$word变量从扩展你这里-doc的。它们在发送到远程系统之前会在本地系统上进行扩展,并且您的本地环境当前包含相当于COLORS="RED GREEN WHITE ORANGE"word=ORANGE,可能是因为您在尝试远程运行它之前已在本地测试了您的小脚本。

有一对夫妇的方式来完成你所需要的。可能是最清晰的是:

ssh [email protected] <<'EOF' 
.... 
EOF 

注意周围EOF单引号的入门线。另外,您也可以保持这里-doc的规格为是,和逃避脚本中$迹象:

ssh [email protected] <<EOF 
.... 
for word in \$COLORS; do 
    echo \$word 
done 
EOF 

这将保护只从局部扩张逃脱的具体变量,并且在存在的情况是非常有用的有些变量您希望在本地进行扩展,而另一些则需要在远程端进行扩展。

0

引用here documents工作:

ssh host <<'EOF' 
COLORS='RED GREEN WHITE ORANGE' 
for word in $COLORS; do 
    echo "$word" 
done 
EOF 

一些注意事项:

  • 你不需要exit。从man ssh

    The session terminates when the command or shell on the remote machine exits and all X11 and TCP connections have been closed.

  • Use More Quotes™