编辑:
看来我的主要问题是通过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得到回应?
答案 0 :(得分:4)
2个问题:
COLORS="RED GREEN WHITE ORANGE"
$
。以下代码有效:
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连接都已关闭时,会话终止。