ヒアドキュメントで変数を渡し、設定する


17

私は、さまざまなリモートマシンでさまざまなことをしなければならないスクリプトを持っています。ヒアドキュメントはこれでうまくいくと思いましたが、スクリプトの他の場所で定義された変数、ヒアドキュメントで定義された変数を使用することはできません。

コードは次のとおりです。

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

これは、次のもののみを印刷します。

FOO =

BAR = bar

ただし、EOF行を次のように引用すると ssh some.remote.host << "EOF" 、次のように出力されます。

FOO = foo

BAR =

ヒアドキュメント内で両方の変数を使用する方法についてのヒントはありますか?

ありがとう。

回答:


26

要するに、以下を使用します。

  • 引用されていないヒアドキュメントのキーワード、例えば EOF
  • 外部ローカル)変数の通常のドル文字、たとえば$FOO
  • 内部(すなわち、リモート)変数のエスケープされたドル文字、例えば\$BAR

あなたはヒアドキュメントのキーワード(すなわちままにした場合EOF)となるよう、そして、ヒアドキュメント本体はローカルで処理された引用符で囲まれていない$FOOに展開さfooBAR空の文字列に展開されます。次に、sshコマンドは次のようになります。

BAR="bar"
echo "FOO=foo"
echo "BAR="

heredocキーワードを引用すると、変数の展開が抑制されるため、sshコマンドは次のようになります。

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

FOOはおそらくリモートシェル環境で定義されていないため、式"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"

1
すごいです!私はこれを理解しようとして長年を過ごしてきました。このソリューションをありがとうございました。
trubliphone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.