Wiele odpowiedzi wykorzystuje eval
i echo
rodzaj pracy, ale przerywa różne rzeczy, takie jak wiele wierszy, próba ucieczki z meta-znaków powłoki, ucieczki wewnątrz szablonu, które nie mają być rozszerzone przez bash itp.
Miałem ten sam problem i napisałem tę funkcję powłoki, która o ile wiem, obsługuje wszystko poprawnie. To nadal usunie tylko końcowe znaki nowej linii z szablonu, z powodu reguł podstawiania poleceń basha, ale nigdy nie stwierdziłem, że jest to problem, o ile wszystko inne pozostaje nienaruszone.
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"
}
Na przykład, możesz go użyć w ten sposób z, parameters.cfg
który jest tak naprawdę skryptem powłoki, który po prostu ustawia zmienne, i template.txt
który jest szablonem, który używa tych zmiennych:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
W praktyce używam tego jako pewnego rodzaju lekkiego systemu szablonów.
eval
.