Cyklus přes více proměnných v bash-i
Miroslav Benes
miroslav_benes na zdas.cz
Čtvrtek Březen 2 12:44:09 CET 2006
Přeji krásný den !
Upravuju takový celkem jednoduchý skript v bash-i, který vybírá soubory
pro zálohování.
Na začátku je definice too, co se má zahrnout do zálohy :
BACKUP_DNS="/var/named /etc/namedb"
BACKUP_MAIL="/etc/mail /etc/aliases"
BACKUP_CONF="/etc/*.conf"
BACKUP_SYSCONFIG="/etc/sysconfig"
BACKUP_CRON="/var/cron /var/at /etc/cron.*/*"
atd.
V další části je pak samotné zpracování. Původní podoba byla :
tar cf - $BACKUP_DNS $BACKUP_MAIL $BACKUP_CONF .. | gzip | ...
To má ovšem několik nevýhod - např. by se seznam souborů nemusel vejít
do příkazové řádky.
První změna (funkční) :
echo `for NAME in "$BACKUP_DNS $BACKUP_MAIL $BACKUP_CONF ... " ; do
echo $NAME ; done` | xargs tar cvf - | gzip | ...
Takto zapsáno to chodí dobře. Ale k dokonalosti tomu ještě chybá
maličkost - aby se všechny názvy vstupujících proměnných zapsaly
najednou. Tedy něco jako :
Druhá změna (nefunkční) :
echo `for NAME in "$BACKUP_* " ; do echo $NAME ; done` | xargs tar cvf
- | gzip | ...
Je to proto, aby se po případné úpravě na začátku skriptu (v seznamech)
nemusela dělat jetě úprava ve výkonné části.
Dá se podobný cyklus nějak jednoduše zapsat v bash-i ? V manuálu i na
netu jsem se po tomto tématu pídil, ale nic jsem nenašel.
BTW jen pro úplnost - momentálně to funguje popsaným způsobem, akorát že
to řešení je malinko kostrbaté :
Současný stav (funkční) :
set |\
grep "^BACKUP_" |\
sed -e "s/.*=/\ /" |\
tr '\047' ' ' |\
xargs tar cvf - 2>/dev/null |\
gzip |\
...
set - vypíše všechny proměnné (pokud obsahují mezery, je jejich obsah v
apostrofech - např. BACKUP_MAIL='/etc/mail /etc/aliases')
grep - vybere jen ty, které nás zajímají
sed - "ukrojí" název proměnné a rovnítko (zbydou jen obsahy)
tr - odstraní apostrofy (nahradí mezerami) - bez této úpravy by se
neexpandovaly wildcards
.. atd.
Další informace o konferenci Linux