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ą.
Najłatwiejszym sposobem, aby to zrobić po prostu w systemie Linux CLI, jest użycie
envsubst
zmiennych środowiskowych.Przykładowy plik szablonu
apache.tmpl
:Biegać
envsubst
i wyślij wynik do nowego plikumy_apache_site.conf
:Wydajność:
źródło
Prawdopodobnie powinieneś zajrzeć do systemu zarządzania konfiguracją, takiego jak Puppet lub Chef . Mogą z łatwością zrobić to, co opisano powyżej i wiele więcej.
źródło
name
, ciąg<%= name %>
w szablonie zostanie zastąpionyname
wartością.name
Oczywiście sposób definiowania poza szablonem różni się między dwoma systemami.Jeśli chcesz mieć lekkie i rzeczywiste szablony zamiast kodu powłoki, który generuje nowe pliki, zwykle wybierane są
sed
&awk
lubperl
. Oto jeden link: http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/Ja użyłbym prawdziwego języka, takiego jak perl, tcl, python, ruby lub coś innego w tej klasie. Coś zbudowanego do pisania skryptów. Wszystkie mają dobre, proste narzędzia do tworzenia szablonów i mnóstwo przykładów w google.
źródło
Używam shtpl za to. (mój prywatny projekt, co oznacza, że nie jest powszechnie używany. Ale może i tak chcesz go przetestować)
Na przykład, chcesz wygenerować / etc / network / interfejsy z pliku csv, możesz to zrobić w następujący sposób:
Zawartość pliku CSV (tutaj test.csv):
Szablon (tutaj interfaces.tpl):
Dowództwo:
Wynik:
Cieszyć się!
źródło
Poprawiłem odpowiedź FooF, aby użytkownik nie musiał ręcznie usuwać cudzysłowów ręcznie:
źródło
Niedawno opublikowałem skrypt bash, który osiąga właśnie to przy użyciu składni szablonu podobnej do jinja. To się nazywa ciasteczko . Oto demo:
źródło
Prawdopodobnie spóźniłem się na to przyjęcie. Jednak natknąłem się na ten sam problem i zdecydowałem się na stworzenie własnego silnika szablonów BASH w kilku wierszach kodu:
Powiedzmy, że masz to
file.template
:A ten
rules
plik:Wykonujesz to polecenie:
Dostajesz to:
Możesz go zainstalować:
To jest strona projektu
źródło
Aby rozwinąć świetną odpowiedź @ FooF (nowe wiersze nie zostały sformatowane w komentarzu), używając znaków kontrolnych heredoc +, możesz zezwolić na dowolne znaki i nazwy plików:
Akceptuje to dowolny znak inny niż null i obcina się tylko wcześnie, jeśli
^D
napotkane zostaną 3 bajty na jego własnej linii (realistycznie nigdy). Zsh obsługuje nawet terminatory zerowe, więcprintf '\x00\x00\x00'
działałoby.template
działa nawet w przypadku zdradliwych nazw plików, takich jak:Uwaga szablony powłoki mogą „rozszerzać” dowolne polecenia, np
$(launch_nukes.sh --target $(curl -sL https://freegeoip.app/csv/ | cut -d, -f 9,10))
. Z wielką mocą…Edycja: jeśli naprawdę nie chcesz, aby Twoje pliki uruchamiały w Tobie nukes, po prostu
sudo -u nobody sh
(lub inny bezpieczny użytkownik) wcześniej.źródło