Dışında hiçbir araç gerekmez /bin/sh
. Formun bir şablon dosyası verildi
Version: ${version}
Path: ${path}
hatta dahil karışık kabuk kodu ile
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)
ve gibi kabuk ayrıştırılabilir bir yapılandırma dosyası
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
bu genişletmek için basit bir mesele
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
Nitekim, kabuk değişkenindeki yapılandırma dosyasının config_file
yolu ve içindeki şablon dosyasının yolu göz önüne alındığında, template_file
yapmanız gereken tek şey:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Bu belki de şablon dosyası olarak tam kabuk betiğine sahip olmaktan daha güzel (@ mtinberg'in çözümü).
Eksiksiz naif şablon genişletici programı:
#!/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
Bu, genişlemeyi standart çıktıya çıkaracaktır; sadece standart çıktıyı bir dosyaya yönlendirmek veya istenen çıktı dosyasını üretmek için yukarıdakileri açık bir şekilde değiştirmek.
Uyarılar: Dosya çıkmamış çift tırnak işareti ( "
) içeriyorsa şablon dosyası genişletme çalışmaz . Güvenlik nedeniyle, eğer şablon dosyası dış varlık tarafından oluşturulmuşsa, bazı açık akıl sağlığı kontrolleri içermeli ya da daha da iyisi, kabuk kaçış dönüşümünü gerçekleştirmeliyiz.