@halloICKEbins Das Skript hat gleich mehrere Probleme.
Wegen der Pipe wird das while
in einer Untershell ausgeführt, dass heisst alles was bis zum done
mit Variablen gemacht wird ist nach dem done
nicht sichtbar, denn das ist dann wieder in der Elternshell.
Was Du da in der Schleife versuchst ist keine gültige Shell-Syntax:
bj@god:~$ NULL[]=42
bash: NULL[]: bad array subscript
Wie bist Du auf diese Idee gekommen? Das sieht so ein bisschen nach raten und versuchen ob man in Bash auch PHP-Syntax verwenden kann aus.
Die Abfrage macht nicht viel Sinn. Bei SELECT name FROM user where name='$line'
kommt ja immer nur wieder der Name heraus, denn man schon in $line
hatte. Ausser wenn man in $line
etwas hat was nicht in der Datenbank enthalten ist. Aber $line
kommt hier ja durch eine Datenbankabfrage aller Namen zustande, also ist die Chance recht klein, dass der Name dann nicht in der Datenbank enthalten ist.
Allerdings wird $line
ziemlich wahrscheinlich nicht (nur) die Namen enthalten, denn die erste Zeile dürfte der Spaltenname sein. Also in diesem Fall name
.
Nach der Schleife ist dann wieder etwas was keine (sinnvolle) Shell-Syntax ist:
bj@god:~$ echo $NULL[1]
[1]
Um auf Indexwerte zuzugreifen muss man geschweifte Klammern setzen:
bj@god:~$ echo ${NULL[1]}
bj@god:~$ NULL=(1 2 3)
bj@god:~$ echo ${NULL[1]}
2
Die Ausgabe eines Programms kann man beispielsweise mit der „compound assignment“-Syntax als Array zuweisen. Allerdings muss man da mit Leerzeichen aufpassen und $IFS
entsprechend ändern wenn nur an Zeilenenden aufgeteilt werden soll.
| #!/bin/bash
OLD_IFS=$IFS
IFS=$'\n'
names=($(mysql -D 'datenbankname' -u 'username' -p'password' -e 'SELECT name FROM user'))
IFS=$OLD_IFS
unset 'names[0]' # Remove column header.
for name in "${names[@]}"; do
echo "$name"
done
|