答えの多くは、作業の種類を使用eval
していますecho
が、複数行、シェルメタ文字のエスケープの試み、bashによる展開を意図していないテンプレート内でのエスケープなど、さまざまなことに失敗しています。
私も同じ問題を抱えていて、このシェル関数を作成しました。これは、私が知る限り、すべてを正しく処理します。これは、bashのコマンド置換ルールのために、テンプレートから末尾の改行のみを削除しますが、他のすべてがそのままである限り、これが問題になることはありません。
apply_shell_expansion() {
declare file="$1"
declare data=$(< "$file")
declare delimiter="__apply_shell_expansion_delimiter__"
declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter"
eval "$command"
}
たとえば、parameters.cfg
変数を設定するだけのシェルスクリプトであるaと、template.txt
それらの変数を使用するテンプレートであるaを使用すると、次のように使用できます。
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
実際には、これを一種の軽量テンプレートシステムとして使用しています。
eval
注意してください。