在定界文档中传递和设置变量

在定界文档中传递和设置变量

我有一个脚本必须在许多不同的远程计算机上执行许多不同的操作。我认为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被扩展为空字符串。那么你的命令就变成:fooBARssh

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"

相关内容