1. ホーム
  2. linux

[解決済み] ファイルから読み込んだ文字列の変数をbashに展開させる

2022-11-25 10:29:24

質問

私は、(ファイルから読み込まれた)文字列内の変数をbashに(強制的に)展開させる方法を見つけ出そうとしています。

私は内容で "something.txt" と呼ばれるファイルを持っています。

hello $FOO world

次に

export FOO=42
echo $(cat something.txt)

が返されます。

   hello $FOO world

変数がセットされているにもかかわらず、$FOOが展開されませんでした。ファイルを実行しようとするので、ファイルをevalしたりソースにしたりできません(そのままでは実行可能ではありません。)

何かアイデアはありますか?

どのように解決するのですか?

私はこの質問に対する答えと思われるものに行き当たりました。 envsubst コマンドです。

envsubst < something.txt

例 ファイルsource.txtの変数を置換し、destination.txtに書き込んでさらに処理する場合。

envsubst < "source.txt" > "destination.txt"

あなたのディストロでまだ利用可能でない場合、これは GNU パッケージにあります。 gettext .

ロックアライト

  • '$' の問題を処理するために小さなラッパースクリプトを書きました。

(ちなみに、envsubstの"feature"は、以下のサイトで説明されています。 https://unix.stackexchange.com/a/294400/7088 で説明されているように、入力の変数の一部だけを展開する機能もありますが、私は例外をエスケープする方がずっと便利だと思います)。 例外をエスケープする方がずっと便利だということに同意します)。

これが私のスクリプトです。

#! /bin/bash
      ## -*-Shell-Script-*-
CmdName=${0##*/}
Usage="usage: $CmdName runs envsubst, but allows '\$' to  keep variables from
    being expanded.
  With option   -sl   '\$' keeps the back-slash.
  Default is to replace  '\$' with '$'
"

if [[ $1 = -h ]]  ;then echo -e >&2  "$Usage" ; exit 1 ;fi
if [[ $1 = -sl ]] ;then  sl='\'  ; shift ;fi

sed 's/\\\$/\${EnVsUbDolR}/g' |  EnVsUbDolR=$sl\$  envsubst  "$@"