变量w / spaces + ssh

时间:2013-06-11 13:55:12

标签: bash unix ssh

编辑:

看来我的主要问题是通过FOR循环的每次迭代处理远程主机上的'word'为空。当我回显时,COLORS变量看起来没问题,它显示了所有四种颜色。

我有一个带有FOR循环的bash脚本,通过ssh调用,如下所示:

ssh user@host02 <<EOF

COLORS=RED GREEN WHITE ORANGE

for word in $COLORS; do
 echo $word
done

exit
EOF

我的输出看起来像这样:

ORANGE
ORANGE
ORANGE
ORANGE

FOR循环在COLORS变量中标识了4个空格分区的args,因为它循环通过并且回显了它看起来的4次,但它只显示最后一个arg,ORANGE。我可以改变什么,以便每个args得到回应?

4 个答案:

答案 0 :(得分:4)

2个问题:

  1. 在变量赋值周围加上引号: COLORS="RED GREEN WHITE ORANGE"
  2. 在HEREDOC中使用时逃离$
  3. 以下代码有效:

    ssh user@host02 <<EOF
    
    COLORS="RED GREEN WHITE ORANGE"
    
    for word in \$COLORS; do
     echo \$word
    done
    
    EOF
    

    我还从中删除了不必要的退出声明。

答案 1 :(得分:4)

您需要保护here-doc中的$COLORS$word变量不受扩展影响。它们在被发送到远程系统之前在本地系统上进行扩展,并且您的本地环境当前包含等效的COLORS="RED GREEN WHITE ORANGE"word=ORANGE,可能是因为您在尝试运行它之前在本地测试了您的小小脚本远程的。

有几种方法可以满足您的需求。可能最干净的是:

ssh user@host02 <<'EOF'
....
EOF

请注意引导行上EOF周围的单引号。或者,您可以按原样保留here-doc规范,并转义脚本中的$符号:

ssh user@host02 <<EOF
....
for word in \$COLORS; do
  echo \$word
done
EOF

这将仅保护您从本地扩展中逃脱的特定变量,并且在您希望在本地扩展的某些变量的情况下有用,而在其他您希望在远程端扩展的其他变量时非常有用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

引用here documents作品:

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

一些注意事项:

  • 您不需要exit。来自man ssh

      

    当远程计算机上的命令或shell退出并且所有X11和TCP连接都已关闭时,会话终止。

  • Use More Quotes™