GNU/Linux >> Znalost Linux >  >> Linux

Šablony s Linuxem ve skriptu Shell?

Řešení 1:

To je velmi možné. Velmi jednoduchým způsobem, jak to implementovat, by bylo, aby soubor šablony byl ve skutečnosti skript a používal proměnné prostředí, jako je

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
cat > /tmp/destfile <<-EOF
here is some config for version $version which should
also reference this path $path
EOF

Můžete to dokonce udělat konfigurovatelné na příkazovém řádku zadáním version=$1 a path=$2 , takže jej můžete spustit jako bash script /foo/bar/baz 1.2.3 . - před tím, než EOF způsobí, že mezery budou ignorovány, použijte obyčejný <<EOF pokud toto chování nechcete.

Dalším způsobem, jak toho dosáhnout, by bylo použití funkce hledání a nahrazení sed

#! /bin/bash
version="1.2.3"
path="/foo/bar/baz"
sed -e "s/VERSION/$version/g" -e "s/PATH/$path/" /path/to/templatefile > /tmp/destfile

který by nahradil každou instanci řetězců VERSION a PATH. Pokud existují jiné důvody, proč by tyto řetězce byly v souboru šablony, můžete hledat a nahradit je VERZE nebo %VERSION% nebo něco s menší pravděpodobností náhodného spuštění.

Řešení 2:

Nejjednodušší způsob, jak to udělat jednoduše v Linux CLI, je použít envsubst a Proměnné prostředí.

Příklad souboru šablony apache.tmpl :

<VirtualHost *:${PORT}>
    ServerName ${SERVER_NAME}
    ServerAlias ${SERVER_ALIAS}
    DocumentRoot "${DOCUMENT_ROOT}"
</VirtualHost>

Spusťte envsubst a výstup výsledku do nového souboru my_apache_site.conf :

export PORT="443"
export SERVER_NAME="example.com"
export SERVER_ALIAS="www.example.com"
export DOCUMENT_ROOT="/var/www/html/"
envsubst < apache.tmpl > my_apache_site.conf

Výstup:

<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot "/var/www/html/"
</VirtualHost>

Řešení 3:

Nejsou potřeba žádné jiné nástroje než /bin/sh . Daný soubor šablony formuláře

Version: ${version}
Path: ${path}

nebo dokonce se smíšeným kódem shellu

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)

a konfigurační soubor analyzovatelný shellem jako

version="1.2.3-r42"
path="/some/place/under/the/rainbow/where/files/dance/in/happiness"
cost="42"

je jednoduché to rozšířit na

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

Ve skutečnosti je daná cesta ke konfiguračnímu souboru v proměnné shellu config_file a cestu k souboru šablony v template_file , vše, co musíte udělat, je:

. ${config_file}
template="$(cat ${template_file})"
eval "echo \"${template}\""

To je možná hezčí než mít kompletní skript shellu jako soubor šablony (řešení @mtinberg).

Kompletní naivní program expandéru šablon:

#!/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

Tím dojde k výstupu rozšíření na standardní výstup; stačí přesměrovat standardní výstup do souboru nebo upravit výše uvedené zřejmým způsobem, aby se vytvořil požadovaný výstupní soubor.

Upozornění: Rozbalení souboru šablony by nefungovalo, pokud by soubor obsahoval dvojité uvozovky bez uvozovek (" ). Z bezpečnostních důvodů bychom pravděpodobně měli zahrnout některé zjevné kontroly zdravého rozumu nebo, ještě lépe, provést transformaci shellu escaping, pokud je soubor šablony generován externí entitou.

Řešení 4:

Pokud chcete spíše lehké a skutečné šablony než kód shellu, který generuje nové soubory, obvyklé možnosti jsou sed &awk nebo perl . Zde je jeden odkaz:http://savvyadmin.com/generate-text-from-templates-scripts-and-csv-data/

Já bych v té třídě použil skutečný jazyk jako perl, tcl, python, ruby ​​nebo něco jiného. Něco stvořeného pro skriptování. Všechny mají dobré, jednoduché nástroje pro vytváření šablon a spoustu příkladů na Googlu.

Řešení 5:

K tomu používám shtpl. (můj soukromý projekt, což znamená, že není široce používán. Ale možná ho přesto chcete otestovat)

Chcete-li například vygenerovat /etc/network/interfaces ze souboru csv, můžete to udělat takto:

Obsah souboru CSV (zde test.csv):

eth0;10.1.0.10;255.255.0.0;10.1.0.1
eth1;192.168.0.10; 255.255.255.0;192.168.0.1

Šablona (zde interfaces.tpl):

#% IFS=';'
#% while read "Val1" "Val2" "Val3" "Val4"; do
auto $Val1 
iface $Val1 inet static
  address $Val2 
  netmask $Val3 
  gateway $Val4 

#% done < "$CSVFILE"

Příkaz:

$ CSVFILE=test.csv sh -c "$( shtpl interfaces.tpl )"

Výsledek:

auto eth0 
iface eth0 inet static
  address 10.1.0.10 
  netmask 255.255.0.0 
  gateway 10.1.0.1 

auto eth1 
iface eth1 inet static
  address 192.168.0.10 
  netmask  255.255.255.0 
  gateway 192.168.0.1

Užijte si to!


Linux
  1. Třídit příkaz v Linuxu s příklady

  2. Oprávnění souborů v Linuxu s příkladem

  3. Zkontrolujte oprávnění souborů Linux pomocí ls

  1. Jak vytvořit dočasný soubor ve skriptu Shell?

  2. Jak změnit slovo v souboru pomocí skriptu linux shell

  3. Může být soubor .sh malware?

  1. Shell Scripting Část I:Začínáme se skriptováním bash

  2. Čtení souboru CSV s SQL dotazy z linuxového shellu

  3. Transliterační skript pro linuxové prostředí