Nhiều câu trả lời bằng cách sử dụng eval
và echo
loại công việc, nhưng phá vỡ những thứ khác nhau, chẳng hạn như nhiều dòng, cố gắng thoát khỏi các ký tự meta shell, thoát bên trong mẫu không nhằm mục đích mở rộng bằng cách bash, v.v.
Tôi đã gặp vấn đề tương tự và đã viết hàm shell này, theo như tôi có thể nói, xử lý mọi thứ một cách chính xác. Điều này sẽ vẫn chỉ loại bỏ các dòng mới theo sau khỏi mẫu, vì các quy tắc thay thế lệnh của bash, nhưng tôi chưa bao giờ thấy đó là một vấn đề miễn là mọi thứ khác vẫn còn nguyên vẹn.
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"
}
Ví dụ: bạn có thể sử dụng nó như thế này với một parameters.cfg
tập lệnh shell thực sự chỉ đặt các biến và một template.txt
là mẫu sử dụng các biến đó:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
Trong thực tế, tôi sử dụng nó như một loại hệ thống mẫu nhẹ.
eval
.