1

编辑:

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

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

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 个空格分隔的参数,因为它循环并回显 4 次,但它只显示最后一个参数 ORANGE。我可以更改什么以便回显每个参数?

4

4 回答 4

4

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

有几种方法可以完成您所需要的。可能最干净的是:

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

EOF请注意介绍行中的单引号。或者,您可以保持 here-doc 规范不变,并转义$脚本中的符号:

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

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

于 2013-06-11T14:23:37.820 回答
4

2个问题:

  1. 在变量赋值周围加上引号: COLORS="RED GREEN WHITE ORANGE"
  2. 在HEREDOC$中使用时转义。

下面的代码有效:

ssh user@host02 <<EOF

COLORS="RED GREEN WHITE ORANGE"

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

EOF

我还从中删除了不必要的退出语句。

于 2013-06-11T14:09:59.380 回答
0

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

于 2013-06-11T13:59:20.350 回答
0
于 2013-06-11T14:28:51.247 回答