改行やその他の特殊文字を使用してファイルの内容を環境変数に設定し、埋め込み変数を解釈します。

改行やその他の特殊文字を使用してファイルの内容を環境変数に設定し、埋め込み変数を解釈します。

改行と特殊文字を含むファイルから環境変数を作成したいことを考えると、次のようになります。手がかりは、コンテンツが解釈される必要がある他の環境変数を参照できることです。たぶん普通のbashよりも洗練されたものが必要かもしれません。

テストファイル「testfile.txt」は次のようになります。

* foo
\/-!~ 
FOO=${FOOBAR}

これまで私が直接管理した内容は次のとおりです。

#!/bin/bash
FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"
content="$(<$file)"
echo "$content"

これは私に出力としてコンテキスト変数を提供します(したがって正確にファイルの内容)。

* foo
\/-!~
FOO=${FOOBAR}

しかし、どうすればいいですか?

  1. ${FOOBAR}を上記で定義した「SUCCESS」に設定し、残りはそのままにしますか?
  2. 内容が(1)の環境変数TESTを設定しますか?

答え1

この回答は許可された回答に基づいて調整されました。https://stackoverflow.com/questions/10683349/forcing-bash-to-expand-variables-in-a-string-loaded-from-a-file

#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"

content="$(envsubst < "$file")"
echo "$content"

eval単に変数を変更するのとは異なり、envsubstコマンドの置き換えや同様の手段で他のプログラムを実行する危険はありません。これは非常にシンプルなシェルテンプレートツールです。

envsubstgettext-baseGNU gettext国際化ユーティリティの一部です(Debianではパッケージにあります)。

envsubst(シェルに組み込まれていない外部コマンドで)エクスポートされた変数のみを表示できます(ただし、シェルに後で定義された変数を環境にエクスポートさせるには、標準オプションを参照してください)allexportsh

答え2

努力する:

eval "content=\$(cat << @@@EOF@@@
$(cat file)
@@@EOF@@@
)"

これは引数、算術、および命令の置換を拡張し、エスケープ(およびそれ自体のみ)および行の連続\に使用されます。たとえば、次のような入力の場合:$`

* foo
\/-!~ 
FOO=${FOOBAR} $((1+1)) $(uname)
\${FOOBAR}\\foo\
bar

これは次のようなものを提供します。

* foo
\/-!~
FOO=content-of-$FOOBAR 2 Linux
${FOOBAR}\foobar

ファイルの内容が完全な管理下にない場合、これはコマンド注入の脆弱性であることは明らかです。

関連情報