Bashスクリプトは変数内の変数を解釈しません。

Bashスクリプトは変数内の変数を解釈しません。

bashスクリプトで使用できるように、構成ファイルに設定されているパスを抽出する必要があります。パスはそのファイル内で次のようになります。

DIR = "${HOME}/test/tmp"

引用符なしで抽出する必要がありますが、次のようにします。

TESTVAR="$(cat /home/user/path/to/file.conf | grep ^DIR | grep -o '".*"' | tr -d '"')"

問題は、コマンドが$ {HOME}変数を「正しく」解釈しないことです。私が電話したとしましょうecho $TESTVAR。結果は次のとおりです。

/home/user/test/tmp

わかりました:

${HOME}/test/tmp

したがって、スクリプト内のコマンドの引数として使用することはできません!

美しいですか?

ベストアンサー1

拡張は再帰的に適用されません。これにより、ドル記号を含むランダムなデータは処理されません。 (関連する問題は、引用符やリダイレクト、その他の演算子も拡張された一般文字であることです。)

最も一般的な習慣の1つは、このような設定ファイルを実際のシェルスクリプトとして使用することです。したがって、(Debianのように/etc/default)ファイルは次のようになります。

DIR="${HOME}/test/tmp"

あなたはそれを読むでしょう

. configfile

もちろんここには問題があります。つまり、ファイルは完全なシェルスクリプトであり、シェル構文に準拠し、任意のコマンドを実行するように構成する必要があるということです。

別の可能性はファイルを実行することですenvsubst。たとえば、質問にあるファイルを使用すると、envsubst < configfile次のように出力されます。

DIR = "/home/me/test/tmp"

または、特定の項目を拡張するために使用することもできますenvsubst '$HOME $OTHER $VARS'

シェルスクリプトとは異なり、envsubst入力ファイルから割り当てを読み取ることはありません。たとえば、ROOTPATH2行目に使用される値は、envsubst環境から取得された値で、1行目の「割り当て」とは関係ありません。

ROOTPATH=/something/$USER
LOGPATH=$ROOTPATH/logs

おすすめ記事