Puoi fare in modo che i tuoi script bash vengano eseguiti in modo diverso in base al contenuto di un database MySQL collegandoti ad esso dalla riga di comando e passando una query, che puoi usare in if
blocchi da ramificare in base a un valore.
Nota: I nostri esempi mostrano l'uso dell'utente root in MySQL, ma vorresti sostituire un altro account utente lì.
Esegui query SQL da uno script bash
La sintassi per l'esecuzione all'interno di uno script bash è la stessa dell'immissione in un database dalla riga di comando:
mysql -u root -pPassword -h hostname -D dbname -e 'query'
Se il tuo database viene eseguito localmente, puoi saltare il -h
bandiera. Se stai eseguendo un database di sviluppo, puoi saltare il -p
controlla se il tuo database non ha password.
Questo genererà i risultati della query in STDOUT, che può reindirizzare a un file:
mysql -u root -D nomedb -e 'SELECT * DA tabella' > file
… o memorizzare in una variabile con il $( )
costruire:
variabile=$(mysql -u root -D nomedb -e 'SELECT * DA tabella')
Ma, l'output non sarà molto carino per impostazione predefinita, così puoi semplificare il lavoro utilizzando il -B
per stampare in formato valore separato da tabulazioni (TSV) e il -N
seleziona per omettere le intestazioni di colonna.
I file TSV sono i cugini meno utilizzati dei file CSV, che puoi convertire dalla riga di comando.
Controllo di un valore specifico e ramificazione
Se vuoi effettuare un fork in base a un valore nel tuo database, puoi interrogare la riga e la colonna specifiche e memorizzare la soluzione in una variabile. Prossimo, puoi usare a provato if
bloccare ramificare in base al contenuto di quella variabile.
campo=$(mysql -u root -BNe 'usa test; SELECT label FROM test WHERE id=1')
Se [ $campo == 'TEST' ]; then
//do stuff
fi
Questo funziona solo quando si richiede un valore specifico e si effettua un semplice confronto. Se hai bisogno di più manipolazione di quanto bash fornisca, Puoi usare awk
, che è possibile scegliere singole colonne di testo e fare confronti:
Se [ $(eco $field | imbarazzante '{Se ($1 == valore && $2 == valore2) Stampa 1; else stampa 0}') == "1" ]; then
//do stuff
fi
Qui il awk
Il comando stampa true o false (1 oh 0), rispetto al bash if
può essere utilizzato per confrontare e forcellare.
In entrambi gli esempi si presuppone che la query SQL restituisca solo una singola riga, cosa puoi garantire selezionando in base all'ID. Ma se stai eseguendo una query più complessa, potresti voler limitare la soluzione alla prima riga con il comando SQL LIMIT 1
.
IMPARENTATO: Come esportare un file CSV dalla riga di comando di MySQL
Verifica degli errori: controlla se esiste un database o una tabella
Anche se probabilmente stai scrivendo questo script appositamente per il tuo server, un piccolo controllo dei bug non fa mai male a nessuno. Dovrai verificare che il database e le tabelle con cui lavorerai esistano effettivamente prima di iniziare a lavorarci.. Allo stesso tempo, Se la connessione al database non funziona, Anche un errore si verificherà qui.
Il comando SQL 'USE dbname'
avrà esito negativo se dbname
non esiste (código de retorno> 0). È possibile utilizzarlo in un if
per verificare se il database è configurato correttamente:
if mysql -u root -e 'USE mydbname'; then //database exists, do stuff fi
Puoi investire il if
blocco booleano iniziale con un !
, che eseguirà il codice solo quando il database non è configurato, che è utile per la prima configurazione.
Nello stesso modo, È possibile verificare la presenza di tabelle quando si tenta di immettere la prima riga:
if mysql -u root -e 'USE mydbname; SELEZIONARE * DA tablename LIMIT 1'; then //database and table exist, do more stuff fi
Perché la if
block controlla il codice restituito di qualsiasi comando inserito su di esso, e i comandi mysql restituiranno un codice di errore in caso di problemi, È possibile utilizzare qualsiasi comando in un if
blocco per prestare attenzione agli errori.