Nie są potrzebne żadne narzędzia inne niż /bin/sh
. Biorąc pod uwagę plik szablonu formularza
Version: ${version}
Path: ${path}
lub nawet z dołączonym mieszanym kodem powłoki
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)
i parsowalny plik konfiguracyjny powłoki jak
version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"
łatwo jest to rozszerzyć
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
Rzeczywiście, biorąc pod uwagę ścieżkę do pliku konfiguracyjnego w zmiennej powłoki config_file
i ścieżkę do pliku szablonu w template_file
, wszystko, co musisz zrobić, to:
. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""
Jest to chyba ładniejsze niż posiadanie pełnego skryptu powłoki jako pliku szablonu (rozwiązanie @ mtinberg).
Kompletny naiwny program ekspandera szablonów:
#!/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
Spowoduje to wygenerowanie rozszerzenia do standardowego wyjścia; wystarczy przekierować standardowe wyjście do pliku lub zmodyfikować powyższe w oczywisty sposób, aby uzyskać pożądany plik wyjściowy.
Ostrzeżenia: Rozszerzenie pliku szablonu nie działałoby, gdyby plik zawierał nieoznaczone podwójne cudzysłowy ( "
). Ze względów bezpieczeństwa prawdopodobnie powinniśmy uwzględnić pewne oczywiste kontrole poczytalności, a nawet lepiej wykonać transformację ucieczki powłoki, jeśli plik szablonu jest generowany przez jednostkę zewnętrzną.