U kunt uw bash-scripts anders laten werken op basis van de inhoud van een MySQL database door er verbinding mee te maken vanaf de opdrachtregel en een query door te geven, die u kunt gebruiken in if-blocks om te vertakken op basis van een waarde.
Opmerking: onze voorbeelden laten zien dat u de root-gebruiker op MySQL gebruikt, maar u zou wil daar een ander gebruikersaccount vervangen.
Sql-query's uitvoeren vanuit een bash-script
De syntaxis voor het uitvoeren in een bash-script is hetzelfde als toegang krijgen tot een database vanaf de opdrachtregel:
mysql -u root -pPassword -h hostnaam -D dbname -e 'query'
Als uw database lokaal wordt uitgevoerd, kunt u de vlag -h weglaten. Als u een ontwikkelingsdatabase gebruikt, kunt u de vlag -p weglaten als uw database geen wachtwoord heeft.
Hierdoor worden de resultaten van de query uitgevoerd naar STDOUT, die u naar een bestand kunt pipen:
mysql -u root -D dbname -e 'SELECT * FROM tabel' > bestand…of opslaan in een variabele met de $( ) constructie:
variable=$(mysql -u root -D dbname -e 'SELECT * FROM table') Advertentie
Maar de uitvoer zal standaard niet erg mooi zijn, dus u kunt het gemakkelijker maken om mee te werken door de -B-vlag te gebruiken om af te drukken in Tab-gescheiden waarden (TSV) -indeling en de -N-vlag om kolomkoppen weg te laten.
TSV-bestanden zijn het minder gebruikte neefje van CSV-bestanden , die u vanaf de opdrachtregel kunt converteren.
Een specifieke waarde en vertakking controleren
Als u wilt vertakken op basis van een waarde in uw database, kunt u de specifieke rij en kolom opvragen en het antwoord opslaan in een variabele. U kunt dan een bash if block to branch gebruiken op basis van de inhoud van die variabele.
field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1') if [ $field == 'TEST' ]; dan //doe dingen fi
Dit werkt alleen wanneer u een specifieke waarde opvraagt en een eenvoudige vergelijking uitvoert. Als je meer manipulatie nodig hebt dan bash biedt, kun je awk gebruiken, waarmee afzonderlijke kolommen uit tekst kunnen worden geselecteerd en vergelijkingen kunnen worden uitgevoerd:
if [ $(echo $field | awk '{if ($1 == value && ; $2 == waarde2) print 1; else print 0}') == “1” ]; dan //do stuff fi
Hier drukt het awk-commando true of false (1 of 0) af, dat de bash if kan gebruiken om te vergelijken en te vertakken.
Beide voorbeelden gaan ervan uit dat uw SQL-query slechts één rij retourneert, wat u kunt verzekeren door te selecteren op basis van ID. Maar als u een complexere query uitvoert, kunt u de reactie beperken tot de eerste rij met het SQL-commando LIMIT 1.
GERELATEERD: Een CSV-bestand exporteren vanaf de MySQL-opdrachtregel
Foutcontrole: controleren of er een database of tabel bestaat
Hoewel je dit script waarschijnlijk speciaal voor je server schrijft, heeft een beetje foutcontrole nooit iemand kwaad gedaan. U zult willen controleren of de database en tabellen waarmee u gaat werken echt bestaan voordat u ermee gaat rommelen. Als de verbinding met de database niet werkt, wordt hier ook een foutmelding gegeven.
Advertentie
Het SQL-commando 'USE dbname' geeft een fout als dbname het niet doet ;t bestaat (retourcode > 0). U kunt dit in een if-blok gebruiken om te controleren of de database correct is geconfigureerd:
if mysql -u root -e 'USE mydbname'; dan bestaat //database, do stuff fi
Je kunt het if-blok omkeren door de boolean te starten met een !, die de code alleen uitvoert als de database niet is geconfigureerd, wat handig is voor de eerste keer instellen .
Op dezelfde manier kunt u controleren of tabellen bestaan door te proberen toegang te krijgen tot de eerste rij:
if mysql -u root -e 'USE mydbname; SELECT * FROM tabelnaam LIMIT 1'; dan bestaan //database en tabel, doe meer dingen fi
Omdat het if-blok de retourcode controleert van welk commando dan ook dat je erin stopt, en MySQL-commando's een foutcode retourneren als ze problemen tegenkomen, kun je elk commando gebruiken in een if-blok om fouten te voorkomen.