Không có công cụ cần thiết nào khác ngoài /bin/sh
. Cho một tệp mẫu của mẫu
Version: ${version}
Path: ${path}
hoặc thậm chí với mã vỏ hỗn hợp bao gồm
Version: ${version}
Path: ${path}
Cost: ${cost}\$
$(i=1; for w in one two three four; do echo Param${i}: ${w}; i=$(expr $i + 1); done)
và một tệp cấu hình có thể phân tích cú pháp shell như
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
việc mở rộng này thành một vấn đề đơn giản
Version: 1.2.3-r42
Path: /some/place/under/the/rainbow/where/files/dance/in/happiness
Cost: 42$
Param1: one
Param2: two
Param3: three
Param4: four
Thật vậy, với đường dẫn đến tệp cấu hình trong biến shell config_file
và đường dẫn đến tệp mẫu trong template_file
, tất cả những gì bạn cần làm là:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Điều này có lẽ đẹp hơn so với việc có tập lệnh shell hoàn chỉnh dưới dạng tệp mẫu (giải pháp của @ mtinberg).
Chương trình mở rộng mẫu ngây thơ hoàn chỉnh:
#!/bin/sh
PROG=$(basename $0)
usage()
{
echo "${PROG} <template-file> [ <config-file> ]"
}
expand()
{
local template="$(cat $1)"
eval "echo \"${template}\""
}
case $# in
1) expand "$1";;
2) . "$2"; expand "$1";;
*) usage; exit 0;;
esac
Điều này sẽ tạo ra sự mở rộng thành đầu ra tiêu chuẩn; chỉ cần chuyển hướng đầu ra tiêu chuẩn sang một tệp hoặc sửa đổi ở trên theo cách rõ ràng để tạo ra tệp đầu ra mong muốn.
Hãy cẩn thận: Mở rộng tệp mẫu sẽ không hoạt động nếu tệp chứa dấu ngoặc kép không thoát ( "
). Vì lý do bảo mật, có lẽ chúng ta nên bao gồm một số kiểm tra độ rõ ràng hoặc thậm chí tốt hơn, thực hiện chuyển đổi thoát vỏ nếu tệp mẫu được tạo bởi thực thể bên ngoài.