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