ubuntuusers.de

Sqlite mit Bash - Die lieben Leerzeichen

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

BlueCase

Anmeldungsdatum:
24. August 2010

Beiträge: 46

Hallo Zusammen, ich habe ein kleines Problem bei einem Bash script und komme irgendwie nicht weiter. Ich versuche gerade das Ergebnis eine SQL query in ein array zu packen. Die query gibt mir 4 spalten aus von der die zweite Spalte Text mit Leerzeichen enthält. Wenn ich das jetzt in ein array schieße werden wird am jeden Leerzeichen umgebrochen und eine neue Array ebene erstellt. Kann mir jemand sagen was ich falsch mache?

1
2
3
4
5
6
7
8
9
declare -a dbarray
dbquery=$(sqlite3 "$dbpath" "select ......;")

dbarray=( $( for i in "$dbquery" ; do echo "$i" ; done ) )

for i in "${dbarray[@]}"
do 
echo "$i" 
done

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wie soll die arme Bash auch wissen, welches Leerzeichen ein Trenner ist und welches nicht ?

Sowas ist sowieso Murks, weil ja nichts wirklich gequotet ist:

dbarray=( $( for i in "$dbquery" ; do echo "$i" ; done ) )

Oder ist die Ausgabe von sqlite3 von sich aus "gequotet" ?
Sonst solltest Du von vorn herein mit for ... in einzeln über die Felder iterieren.

Poste doch mal bitte eine Muster-Ausgabe von sqlite3 "$dbpath" "select ......;" damit ich das Format sehen kann.

track

BlueCase

(Themenstarter)

Anmeldungsdatum:
24. August 2010

Beiträge: 46

Hi, ja das ist genau mein Problem.. Aber ich komm nicht drauf...

bsp der sql query: 284|Geburtstag Caro|8186|/home/bluecase/Bilder/2011/07/10/P1010371.JPG

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Mit dem "|" als Trenner ist ja auch fies ...

Aber wenn wir mal in Greg's Wiki nachgucken, finden wir dafür eine Lösung:

IFS="|" read -a dbarray   < <( sqlite3 "$dbpath" "select ......;" )

wobei wir (von rechts nach links)

  1. die Ausgabe der DB-Abfrage mit einer "Process Sustitution" in die Dateiumleitung einfädeln
    (eine normale Pipe geht nicht, denn dabei läuft jeder Teil in einer Subshell. Die Variablen kommen dann bei der Muttershell nicht an)

  2. direkt in das Array mit read einlesen, nachdem wir den Trenner für diesen Befehl auf "|" umgestellt haben.

LG,

track

BlueCase

(Themenstarter)

Anmeldungsdatum:
24. August 2010

Beiträge: 46

Cool, probier ich nachher gleich mal...

btw. man kann sqlite3 auch anweisen einen anderen Separator zu benutzen...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ich benutze gerne [TAB] als Separator. Damit geht es auch direkt:

IFS=$'\t' dbarray=( $( sqlite3 "$dbpath" "select ......;" ) )

Das ist etwas einfacher.
- oh, das funktioniert ja auch mit "|" als Trenner ...

IFS='|' dbarray=( $( sqlite3 "$dbpath" "select ......;" ) )

Dann hätten wir den Handstand mit der Process Substitution gar nicht machen brauchen 😳
(aber vorhin beim testen hatte ich es nicht hinbekommen)

track

Antworten |