Wie kann ich Benutzereingaben als Array in der bash
Shell lesen ?
./array_test.sh < war_and_peace.txt
.
Wie kann ich Benutzereingaben als Array in der bash
Shell lesen ?
./array_test.sh < war_and_peace.txt
.
Antworten:
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:
Das Advanced Bash-Scripting Guide enthält ein umfangreiches Kapitel zu Arrays
Die Hilfeseite des Lese builtin
15 Array-Beispiele von thegeekstuff.com
read -r
ist manchmal sehr nützlich / wichtig ... Stefano's Link zur "read builtin manpage" erklärt seinen Zweck ... (um Backslash-Interpretation zu verhindern).
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.
IFS
Problem aufmerksam gemacht haben. Ohne es zu nullen, 'lesen' Sie Skripte alle führenden und nachfolgenden Leerzeichen ... und natürlich auch die -r
...
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 read
einfache 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 read
nichts tut , wenn stdin
ein 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 b
ist 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 .
cat war_and_peace.txt | ./array_test.sh
.