Багато відповідей використовують 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.