Autor | Zpráva | ||
---|---|---|---|
anonym_ Profil * |
#1 · Zasláno: 29. 5. 2014, 12:03:09
Ahoj,
mám tu .sh script, chápu jeho funkci, ale když se trochu více ponořím a snažím se pochopit, proč je napsán zrovna tak, jak je napsán (a jestli by nešel napsat jednodušeji), přijde mi, že mu moc nerozumím. Konkrétně se jedná o tuto řádku databases=`mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database` Konkrétně se ztrácím v části za " SHOW DATABASES;" "
Děkuji za vysvětlení. |
||
juriad Profil |
Tento příkaz uloží do proměnné databases výstup následující posloupnosti úkonů (to je to
databases=`...` )
1) mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;"
Připojení k databázi programem mysql s uživatelem uloženým v proměnné USER a heslem z proměnné PASSWORD. Po připojení se rovnou spustí jediný SQL dotaz SHOW DATABASES; . Toto vrátí seznam všech databází.
2) tr -d "| "
Ten seznam je ale v nepěkném formátu, proto se napřed odstraní všechny svislítka a mezery. 3) grep -v Database
Výsledný seznam obsahuje jednak seznam databází, ale i hlavičku s nadpisem "Database". Tohoto řádku se zbaví grep s přepínačem -v (inverse), který ponechá řádky, které neodpovídají zadání. Svislítko mezi programy znamená předání výstupu na vstup tomu následujícímu. Zpětné apostrofy vyhodnotí výraz, který je mezi nimi. Jinak by se titiž do proměnné databases uložil řetězec "mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database" .
A ano, je to řešené celkem jednoduše a běžně se s takovou konstrukcí setkáš. V shellu je filosofie taková, že jeden program má dělat jen jednu věc a pořádně, proto je jich často třeba zkombinovat více. |
||
anonym_ Profil * |
#3 · Zasláno: 29. 5. 2014, 12:21:59
juriad:
V pořádku. Děkuji za vysvětlení. Začátek, tzn. připojení k DB a položení dotazu jsem chápal bez problémů, šlo mi o ten konec. Ten jsi mi vysvětlil bezchybně. Myslel jsem ne napsat jednodušeji (ve smyslu napsat na jeden řádek), script jednoduchý sám o sobě je. Spíše jsem si nebyl jistý tím, co tam dělá na konci ten grep a jestli to není nějaký bordel spíše. Není. |
||
Davex Profil |
#4 · Zasláno: 29. 5. 2014, 18:30:54
Pomocí přepínačů
-N a -B to jde zjednodušit takto:
databases=`mysql --user=$USER --password=$PASSWORD -N -B -e "SHOW DATABASES;"` nebo novějším způsobem databases=$(mysql --user=$USER --password=$PASSWORD -N -B -e "SHOW DATABASES;") |
||
anonym_ Profil * |
#5 · Zasláno: 30. 5. 2014, 09:37:03
Ještě bych se chtěl k odkázanému skritpu, který přiložím i níže, zeptat, jestli by bylo možné uložit je všechny do jednoho souboru. Teď se ukládá každá databáze samostatně do vlastního archivu.
#!/bin/bash USER="your_user" PASSWORD="your_password" OUTPUT="/Users/rabino/DBs" rm "$OUTPUTDIR/*gz" > /dev/null 2>&1 databases=`mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database` for db in $databases; do if [[ "$db" != "information_schema" ]] && [[ "$db" != _* ]] ; then echo "Dumping database: $db" mysqldump --force --opt --user=$USER --password=$PASSWORD --databases $db > $OUTPUT/`date +%Y%m%d`.$db.sql gzip $OUTPUT/`date +%Y%m%d`.$db.sql fi done |
||
juriad Profil |
#6 · Zasláno: 30. 5. 2014, 09:45:26
Celý cyklus nahraď za:
mysqldump --force --opt --user=$USER --password=$PASSWORD --all-databases > $OUTPUT/`date +%Y%m%d`.all.sql gzip $OUTPUT/`date +%Y%m%d`.all.sql Mysqldump totiž umí dumpnout všechny databáze najednou. Nevím nakolik je tam ta podmínka na 12. řádku nutná. |
||
Časová prodleva: 11 let
|
0