1. ホーム
  2. バッシュ

[解決済み】bashのheredocの中で変数を使用する。

2022-04-04 05:15:16

質問

bashのheredocの中で変数を補間しようとしています。

var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF

これは期待通りに動いていませんね( $var は展開されず、文字通りに扱われます)。

を使用する必要があります。 sudo tee というのも、ファイルを作成するにはsudoが必要だからです。 みたいなことをする。

sudo cat > /path/to/outfile <<EOT
my text...
EOT

うまくいきません、なぜなら >outfile は、sudo を使用していない現在のシェルでファイルを開きます。

解決方法は?

最初の質問に対する答えですが、デリミターを引用符で囲んでいるため、パラメータの置換は行われません。 bashのマニュアルには :

<ブロッククオート

ヒアドキュメントのフォーマットは

      <<[-]word
              here-document
      delimiter

パラメータ展開、コマンド置換、算術展開、および パス名展開が行われるのは ワード . の中に文字がある場合 単語 は が引用された場合 デリミタ はワードで引用符を削除した結果であり、また の行は展開されない。 もし ワード が引用されていない場合、すべての の行は、パラメータ展開、コマンド置換、算術展開の対象となる。[...]

最初の例を変更して <<EOF の代わりに << "EOF" をクリックすると、うまくいくことがわかります。

2番目の例では、シェルは sudo のみで、パラメータ cat の出力に適用され、リダイレクションは sudo cat を元のユーザーとして使用します。 試してみるとうまくいきますよ。

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT