Banyak jawaban yang menggunakan evaldan echojenis pekerjaan, tetapi merusak berbagai hal, seperti beberapa baris, mencoba untuk keluar dari meta-karakter shell, melarikan diri di dalam template yang tidak dimaksudkan untuk diperluas oleh bash, dll.
Saya memiliki masalah yang sama, dan menulis fungsi shell ini, yang sejauh yang saya tahu, menangani semuanya dengan benar. Ini masih akan menghapus hanya baris baru dari template, karena aturan substitusi perintah bash, tetapi saya tidak pernah menemukan itu menjadi masalah selama yang lainnya tetap utuh.
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"
}
Misalnya, Anda dapat menggunakannya seperti ini dengan parameters.cfgyang merupakan skrip shell yang hanya menetapkan variabel, dan template.txttemplate yang menggunakan variabel tersebut:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
Dalam praktiknya, saya menggunakan ini sebagai semacam sistem template ringan.
eval.