区切り文書で変数を渡して設定する

区切り文書で変数を渡して設定する

さまざまなリモートシステムでさまざまなタスクを実行する必要があるスクリプトがあります。 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
  • 普通ドル文字外の(つまり地元の)変数(例:$FOO
  • 脱出するドル文字は内部に(つまり離れて)変数(例:\$BAR

heredocキーワード(例EOF:)を引用符なしで残すと、heredoc本体はローカルで処理されるため、空の$FOO文字列に展開されます。その後、コマンドは次のようになります。fooBARssh

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"

おすすめ記事