ubuntuusers.de

Bash und MySQL

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

JimiJones

Anmeldungsdatum:
3. August 2009

Beiträge: Zähle...

Hallo zusammen,

ich will ein Bash-Script schreiben, das beim ausführen sich mit meiner Datenbank verbindet, eine neue Datenbank anlegt und dann dort hinein 2 Tabellen erstellt.

mysql -u root --execute = "create database adresskartei"

Verbinden und die Datenbank erstellen war erfolgreich, nur wie setzt ich jetzt die anderen Befehle ab, ohne das ich mich jedes mal mit der Datenbank neu verbinden muss??

Habs mal so probiert,aber das hat nicht geklappt:

mysql -u root --execute='create database adresskartei
                         character set latin1
                         collate latin1_german1_ci' |

                         'use database adresskartei' |

                         'create table kontakte';

Hoffe ich konnte es verständlich erklären.

Gruß

Forgath

Anmeldungsdatum:
2. Januar 2008

Beiträge: 149

Also.. mit MySql kenn ich mich garnicht aus.. Aber mit | leitest du die Ausgabe an das daraufolgende weiter. Ist es richtig das du das Ergebniss von "create database adresskartei character set latin collate latin1_german1_ci'" an 'use database adresskartei' weitergeben willst oder ist dies ein extra befehl?

JimiJones

(Themenstarter)

Anmeldungsdatum:
3. August 2009

Beiträge: 15

naja weitergeben will ichs nicht.....use database adresskartei ist ein extra nzw. ein nuer befehl

schmauch

Avatar von schmauch

Anmeldungsdatum:
27. April 2009

Beiträge: 115

Wohnort: Wettswil a. A.

Du kannst auch alle SQL-Anweisungen in eine Datei auslagern und diese dem MySQL Aufruf mitgeben:

mysql -u root <datei_mit_den_anweisungen

Gruss Schmauch

prometheus0815

Anmeldungsdatum:
12. Juni 2006

Beiträge: 7478

Wie ich es sehen, würde die Ausgabe von

mysql -u root --execute='create database adresskartei
                         character set latin1
                         collate latin1_german1_ci'

weitergeleitet an

'use database adresskartei'

so dass der Fehler wohl lautet

use database adresskartei: command not found

da die Shell keinen use-Befehl kennt.

Forgath

Anmeldungsdatum:
2. Januar 2008

Beiträge: 149

Versuch ma einfach

--execute=*Dein Befehl* --execute=*dein 2ter Befehl*

usw.

Bei Rsync gings bei mir

JimiJones

(Themenstarter)

Anmeldungsdatum:
3. August 2009

Beiträge: 15

Ja das mit der | das dies weiterleitung bedeutet, war mir nicht klar, verständlich dass es nicht geklappt hat... leider war die möglichkeit mit den mehrfachen --execute auch nicht erfolgreich... wie vorher hat er da die datenbank erstellt, aber danach hört er auf und bringt die fehlermeldung ./sqlconnect: line 8: --execute=use database adresskartei: command not found

xabbuh Team-Icon

Anmeldungsdatum:
25. Mai 2006

Beiträge: 6411

Du kannst die einzelnen Abfragen separiert durch Semikolons mit -e bzw. --exececute übergeben.

Gruß

hannemann

Anmeldungsdatum:
25. Mai 2007

Beiträge: 1310

MySQL Statements können mit einem Semikolon voneinander getrennt werden...

mysql -u lala -e 'SELECT * FROM lala; SELECT * FROM blabla'

JimiJones

(Themenstarter)

Anmeldungsdatum:
3. August 2009

Beiträge: 15

super mit ; funktionierts!!

Vielen Dank!!!

prometheus0815

Anmeldungsdatum:
12. Juni 2006

Beiträge: 7478

Bitte denke daran, den Thread als gelöst zu markieren. Danke!

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

"create database adresskartei character set latin1 collate latin1_german1_ci'; use database adresskartei; create table kontakte;"

FLoH.tar

Anmeldungsdatum:
6. Januar 2006

Beiträge: 470

oder auch so:

cat <<"EOF" | mysql -u root
create database adresskartei
    character set latin1
    collate latin1_german1_ci
    ;
use database adresskartei;
create table kontakte;
EOF

Gegenüber der Variante mit --execute besteht der Vorteil der Lesbarkeit. Auch eine temporäre Datei braucht man so nicht. Aber am wichtigsten ist die Möglichkeit, dass innerhalb des SQLs eingebettete Shellvariablen ($sowasHier) interpoliert werden, was man gerade in Skripts gut brauchen kann. Dazu darf man aber nicht die Anführungszeichen bei <<"EOF" vergessen.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

FLoH.tar schrieb:

oder auch so:

cat <<"EOF" | mysql -u root

Willst Du es nicht zur Sicherheit noch ein paar mal durch cat pipen? Man weiß ja nie...

Gegenüber der Variante mit --execute besteht der Vorteil der Lesbarkeit. Auch eine temporäre Datei braucht man so nicht. Aber am wichtigsten ist die Möglichkeit, dass innerhalb des SQLs eingebettete Shellvariablen ($sowasHier) interpoliert werden, was man gerade in Skripts gut brauchen kann. Dazu darf man aber nicht die Anführungszeichen bei <<"EOF" vergessen.

Anführungszeichen werden in Shell-Scripten dazu genutzt, das Word Splitting, das die Shell normalerweise durchführt, zu unterbinden. Da EOF aber ohnehin keinen Whitespace enthält, ist es egal, ob man es in Anführungszeichen setzt oder nicht.

Antworten |