改行と特殊文字を含むファイルから環境変数を作成したいことを考えると、次のようになります。手がかりは、コンテンツが解釈される必要がある他の環境変数を参照できることです。たぶん普通の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}
しかし、どうすればいいですか?
- ${FOOBAR}を上記で定義した「SUCCESS」に設定し、残りはそのままにしますか?
- 内容が(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
コマンドの置き換えや同様の手段で他のプログラムを実行する危険はありません。これは非常にシンプルなシェルテンプレートツールです。
envsubst
gettext-base
GNU gettext国際化ユーティリティの一部です(Debianではパッケージにあります)。
envsubst
(シェルに組み込まれていない外部コマンドで)エクスポートされた変数のみを表示できます(ただし、シェルに後で定義された変数を環境にエクスポートさせるには、標準オプションを参照してください)allexport
。sh
答え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
ファイルの内容が完全な管理下にない場合、これはコマンド注入の脆弱性であることは明らかです。