หลายคำตอบโดยใช้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
ซึ่งเป็นเชลล์สคริปต์ที่ตั้งค่าตัวแปรเท่านั้นและtemplate.txt
ซึ่งเป็นเทมเพลตที่ใช้ตัวแปรเหล่านั้น:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
ในทางปฏิบัติฉันใช้สิ่งนี้เป็นระบบเทมเพลตน้ำหนักเบา
eval
.