我有一个脚本必须在许多不同的远程计算机上执行许多不同的操作。我认为heredoc可以解决这个问题,但我无法使用脚本中其他地方定义的变量和此处定义的一个。
这是一些代码:
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
EOF
这仅打印以下内容:
FOO=
酒吧=酒吧
但是,如果我像这样引用 EOF 行:
ssh some.remote.host << "EOF"
那么它只会打印以下内容:
FOO=富
酒吧=
关于如何使用的任何提示两个都Heredoc 中的变量?
谢谢。
答案1
简而言之,使用:
- 未加引号的定界符关键字,例如,
EOF
- 常规美元字符外(IE当地的)变量,例如,
$FOO
- 逃脱了美元字符为内(IE偏僻的)变量,例如
\$BAR
如果您将heredoc关键字(即EOF
)不加引号,那么heredoc主体将在本地处理,因此将$FOO
被扩展为空字符串。那么你的命令就变成:foo
BAR
ssh
BAR="bar"
echo "FOO=foo"
echo "BAR="
如果您引用heredoc关键字,则变量扩展将被抑制,因此您的ssh
命令将变为:
BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"
由于FOO
可能未在远程 shell 环境中定义,因此表达式的"FOO=$FOO"
计算结果为"FOO=''"
,即FOO
设置为空字符串。
如果你想使用这两个变量,那么你需要不加引号的heredoc关键字,以便本地定义的变量发生变量扩展,然后转义(用反斜杠)你想要远程扩展的变量,即:
#!/bin/sh
FOO="foo"
ssh some.remote.host << EOF
BAR="bar"
echo "FOO=$FOO"
echo "BAR=\$BAR"
EOF
在这种情况下,您的 ssh 命令(由远程服务器接收)将如下:
BAR="bar"
echo "FOO=foo"
echo "BAR=$BAR"