Многие ответы с использованием 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"
}
Например, вы можете использовать его таким образом с a, parameters.cfg
который на самом деле является сценарием оболочки, который просто устанавливает переменные, и template.txt
с шаблоном, который использует эти переменные:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
На практике я использую это как своего рода облегченную систему шаблонов.
eval
.