さまざまなリモートシステムでさまざまなタスクを実行する必要があるスクリプトがあります。 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
文字列に展開されます。その後、コマンドは次のようになります。foo
BAR
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"