Wie kann ich Benutzereingaben als Array in Bash lesen?

15

Wie kann ich Benutzereingaben als Array in der bashShell lesen ?

moata_u
quelle
Ich nehme an, du willst von stdin lesen? Meine Antwort wird auch mit Ausführung wie funktionieren cat war_and_peace.txt | ./array_test.sh.
Stefano Palazzo
Oder einfach ./array_test.sh < war_and_peace.txt.
Eliah Kagan

Antworten:

14

Hier ist eine Möglichkeit, dies zu tun:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Wenn Sie es nur ausführen, liest es so lange von der Standardeingabe, bis Sie Strg + D (EOF) drücken. Danach befinden sich die von Ihnen eingegebenen Zeilen in my_array. Einige mögen diesen Code verwirrend finden. Der Körper der Schleife sagt im Grunde my_array = my_array + element.

Einige interessante Dokumente:

Stefano Palazzo
quelle
3
read -rist manchmal sehr nützlich / wichtig ... Stefano's Link zur "read builtin manpage" erklärt seinen Zweck ... (um Backslash-Interpretation zu verhindern).
Peter.O
10

Lies es so:

read -a arr

Und zum Drucken verwenden Sie:

for elem in ${arr[@]}
do 
  echo $elem
done
ABcDexter
quelle
4

Und eine, die das Array nicht jedes Mal neu erstellt (obwohl Bash 3.1 oder neuer erforderlich ist):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

Weitere Informationen finden Sie unter http://mywiki.wooledge.org/BashFAQ/001 .

Und um Fehler zu vermeiden, lesen Sie wie immer http://mywiki.wooledge.org/BashGuide und vermeiden Sie die tldp-Handbücher wie das Advanced bash scripting guide.

geirha
quelle
Nette Links ... Danke, dass Sie auf das IFSProblem aufmerksam gemacht haben. Ohne es zu nullen, 'lesen' Sie Skripte alle führenden und nachfolgenden Leerzeichen ... und natürlich auch die -r...
Peter.O
0

Wie wäre es mit diesem Einzeiler;)

arr=( $(cat -) )
echo ${arr[@]}

Bearbeiten:

In bash,

arr=(val1 val2 ...)

ist die Art der Zuweisung zu einem Array . In Verbindung mit der Befehlssubstitution können Sie Arrays aus der Pipeline einlesen, mit denen dies nicht auf readeinfache Weise erreicht werden kann:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

Sie werden auf die Tatsache zurückzuführen , dass es Ausgabe nichts finden , das readnichts tut , wenn stdinein Rohr , da eine Pipeline in einer Subshell ausgeführt werden kann , so dass die Variable überhaupt nicht verwendet werden können.

Verwenden Sie den in dieser Antwort vorgeschlagenen Weg:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

Dies a bist viel einfacher und unkomplizierter als jede Problemumgehung, die durch die Antworten von Read-Werten in eine Shell-Variable aus einer Pipe und beim bash-Lesen, nachdem eine Pipe keine Werte festlegt, gegeben wird .

Quark
quelle
hast du es getestet
cmak.fr
@ cmak.fr Ja, es funktioniert für mich
Quark
@ Melebius Ich habe eine Erklärung dazu und den Vorteil dieses Einzeilers angehängt.
JiaHao Xu