Autor Zpráva
anonym_
Profil *
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`
kód je http://danieldvork.in/script-for-mysql-backup-to-dropbox/.

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 *
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
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 *
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
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á.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0