bash script: variable in mysql

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • ich bin grad am verzweifeln, da ich nicht die richtige escape-sequenz finde. der INSERT befehl geht einfach nicht. folgender code:


    Bash
    #!/bin/bash
    
    
    serial=sudo mache was
    #echo $serial
    
    
    mysql -D DBname -u root -pgeheimespw -e "CREATE TABLE IF NOT EXISTS hardware (id INT NOT NULL AUTO_INCREMENT, serial varchar(55), PRIMARY KEY (id) );"
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES ("$serial") ;"


    auch ein

    Zitat

    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES ("[font="Consolas, Menlo, Monaco,"]${serial}") ;"[/font]


    [font="Consolas, Menlo, Monaco,"]geht nicht[/font]

    Einmal editiert, zuletzt von noobee (10. September 2016 um 02:08)

  • Hm ... sorry ... ein bisschen viel serial in der Zeile

    Zitat


    (serial) VALUES ("${serial}") ;"

    In diesem Fall würde ich das Kommando mal mit echo ausgeben. Dann mysql aufrufen und dort den insert eingeben.
    Meine Vermutung: Dein $serial besteht aus mehreren "Worten" durch Leerzeichen getrennt ...
    Das müsste dann vermutlich mit maskierten, einfachen oder auch doppelten Hochkommas umschlossen werden.

    cu,
    -ds-

  • Dein $serial besteht aus mehreren "Worten" durch Leerzeichen getrennt ...Das müsste dann vermutlich mit maskierten, einfachen oder auch doppelten Hochkommas umschlossen werden.

    nein, es steht nur ein langer string drin. aber selbst mit hochkomma hat es nicht gefunzt. weder einfache noch doppelte. der eintrag in der tabelle war immer leer.

    ich hatte auch schon mit \042 getestet. auch ohne erfolg

    in $serial würde das drin stehen: 00215846325156alux

    die spalte heißt übrigens serial und die variable aus bash heißt auch $serial

    Einmal editiert, zuletzt von noobee (10. September 2016 um 10:56)

  • also wenn ich den befehl

    Code
    mysql -D DBname-u root -pgeheim -e "INSERT INTO hardware (serial) VALUES ('45636463e'); "

    exakt so in der konsole ausführe, passt alles wqunderbar. dann steht in meiner tabelle auch der wert "45636463e" drin. es liegt also nur an der variable. da mach ich immer den fehler

    Einmal editiert, zuletzt von noobee (10. September 2016 um 12:51)

  • Hmm ...

    und das

    Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES (\'$serial\') ;"

    oder das

    Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES (\'"$serial"\') ;"

    hattest Du schon probiert?

  • japp, ich hab gefühlt bereits alle escape sequenzen probiert. deine zwei oberen bringen den fehler: ERROR at line 1: Unknown command '\''. egal ob mit einem oder 2 Hochkomma.

    ich hab im netz noch gefunden, dass es mit \042 auch gehen könnte. also so hier:

    Code
    mysql -D DBname -u root -pgeheim -e "INSERT INTO hardware (serial) VALUES ("\042$serial\042"); "


    das gibt zwar keinen fehler, schreibt mir aber den wert 42042 in die DB. ich geb hier mal die komplette bash an

    Bash
    #!/bin/bash
    
    
    serial=sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2
    #echo $serial
    mysql -D DBname -u root -pgeheim -e "CREATE TABLE IF NOT EXISTS hardware (id INT NOT NULL AUTO_INCREMENT, serial varchar(55), PRIMARY KEY (id) );"
    mysql -D DBname -u root -pgeheim -e "INSERT INTO hardware (serial) VALUES ("$serial"); "
  • Echt sonderbar ...

    also so:

    Bash
    #!/bin/bash
    
    
    serial=aswdesrertg
    #echo $serial
    mysql -D hulle -u root -ppassword -e "CREATE TABLE IF NOT EXISTS hardware (id INT NOT NULL AUTO_INCREMENT, serial varchar(55), PRIMARY KEY (id) );"
    mysql -D hulle -u root -ppassword -e "INSERT INTO hardware (serial) VALUES (\"$serial\"); "

    funktioniert es bei mir ...

    Nehme ich Dein script

    Bash
    #!/bin/bash
    
    
    serial=aswdesrertg
    #echo $serial
    mysql -D Dhulle -u root -ppassword -e "CREATE TABLE IF NOT EXISTS hardware (id INT NOT NULL AUTO_INCREMENT, serial varchar(55), PRIMARY KEY (id) );"
    mysql -D Dhulle -u root -ppassword -e "INSERT INTO hardware (serial) VALUES ("$serial"); "


    gibt's nen Fehler

    Zitat


    dirk@mars:~$ ./db.sh
    mysql: [Warning] Using a password on the command line interface can be insecure.
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1054 (42S22) at line 1: Unknown column 'aswdesrertg' in 'field list'

    hat also scheinbar doch mit den Hochkommata zu tun ;)

    cu,
    -ds-

  • kann es sein, dass in DB geschrieben wird? nur ist der string eben leer?

    sobald ich händisch nen sinnlosen string nehme (serial=abcdefghi), dann funktioniert es. ich bekomme den eintrag in die DB.
    sobald ich aber das ergebnis von "sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2" in die variable $serial lege, ist diese leer ?!? warum wird die variable geleert???

    also test:

    Bash
    #!/bin/bash
    
    
    #serial=3634655464n
    serial=sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2
    
    
    echo $serial."1"
    echo $serial."2"


    ->gibt die ausgabe:
    043934564s (ist das echte ergebnis von sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2)
    .1 (hier sollte das ergebnis nochmal stehen)
    .2 (hier auch)

    das bedeutet doch, in den 2 fällen des echos ist die variable leer. also wird was in die DB geschrieben, es ist eben nur ein leerer string. aber warum ?? :@ :@ :wallbash:

    oder wird das ergebnis gar nicht in die variable geschrieben :denker: :denker: :denker:

    Einmal editiert, zuletzt von noobee (10. September 2016 um 14:49)

  • Hm ... ich denke, das hat was mit sudo und einer weiteren bash zu tun, die da evtl. gestartet wird.
    Wie dem auch sei: setz' das Kommando mal zwischen grave accent Zeichen (das ist das Hochkomma, das verkehrt herum steht) ... alternativ dazu runde Klammern setzen.

    //EDIT: das war mal wieder Quatsch ... das hat nix mit ner weiteren bash zu tun ... das Kommando ist so schlicht falsch und deshalb wird serial kein Wert zugewiesen ...*

    Also:

    Code
    pi@pi-zero:~ $ serial=`sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2`
    pi@pi-zero:~ $ echo $serial
    000000005ef0f856
    pi@pi-zero:~ $ serial=$(sudo cat /proc/cpuinfo | grep Serial | tr -d " " | cut -d ":" -f 2)
    pi@pi-zero:~ $ echo $serial
    000000005ef0f856
    pi@pi-zero:~ $


    dann sollte das klappen ;)

    //EDIT: Erklärung - das ist eine Kommandofolge mit Leezeichen usw drin. Das kann so nun mal nicht angegeben werden.

    cu,
    -ds-

  • aaaalter schwede. du bist mein held. ich hatte bisher immer nur die geraden einfachen hochkomma genutzt. diese blöden schrägen hochkomma kamen nie in frage.

    aber DU hast recht. es geht. aber es geht nur mit den schrägen hockomma, nicht mit den klammern. aber trotzdem PERFEKT :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :danke_ATDE: :thumbs1: :thumbs1: :thumbs1: :thumbs1: :thumbs1: :thumbs1: :bravo2: :bravo2: :bravo2: :bravo2: :bravo2: :bravo2: :bravo2:

  • Keine Ursache ... dafür simma ja hier ;)

    Das mit der Klammer sollte aber auch gehen ... das führende $-Zeichen nicht vergessen :) ... also serial=$(....)

    //EDIT: Tipp am Rande: Setz mal als erstes Statement in das bash script ein set -x, also:

    Bash
    #!/bin/bash
    #
    set -x
    
    
    ...


    und lass das script dann noch mal laufen ;)


    cu,
    -ds-

  • Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES (\'$serial\') ;"
    Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES (\'"$serial"\') ;"

    Was auch gehen sollte:

    Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES ('$serial');"


    Oder

    Code
    mysql -D DBname -u root -pgeheimespw -e "INSERT INTO hardware (serial) VALUES (\"$serial\");"

    Die einfachen ' brauch man IMHO nicht escapen, es sei denn man schreibt 'INSERT INTO hardware (serial) VALUES (\'$serial\');'


    Zum auslesen von /proc/cpuinfo braucht man kein sudo und cat | grep braucht man ebenfalls nicht:

    Code
    pi@raspberrypi:~$ grep Serial /proc/cpuinfo
    Serial          : 00000000b751890d
    pi@raspberrypi:~$


    tr -d " " müsste eigentlich auch überflüssig sein, statt cut einfach awk nutzen:

    Code
    pi@raspberrypi:~$ grep Serial /proc/cpuinfo | awk '{print $3}'
    00000000b751890d
    pi@raspberrypi:~$

    Oder nicht als Trennzeichen ":" sondern ein einfaches Leerzeichen:

    Code
    pi@raspberrypi:~$ grep Serial /proc/cpuinfo | cut -d " " -f 2  
    00000000b751890d
    pi@raspberrypi:~$

    :angel:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!