Ich möchte das Äquivalent von erreichen:
list=()
while read i; do
list+=("$i")
done <<<"$input"
mit
IFS=$'\n' read -r -a list <<<"$input"
Was mache ich falsch?
input=`/bin/ls /`
IFS=$'\n' read -r -a list <<<"$input"
for i in "${list[@]}"; do
echo "$i"
done
Dies sollte eine Liste von drucken /
, aber ich bekomme nur den ersten Artikel.
ls
, tun Sie dies nicht. Verwenden Sielist=(/*)
.Antworten:
Sie müssen mapfile (oder das in eingeführte Synonym readarray
bash 4.0
) verwenden:Ein Leseaufruf nur Arbeit mit einer Zeile, nicht der gesamten Standardeingabe.
read -a list
Füllen Sie den Inhalt der ersten Standardzeile in das Array einlist
. In Ihrem Fall haben Siebin
als einziges Element in der Array-Liste.quelle
IFS
ist nutzlos, weilmapfile
es bei seiner Eingabe keine Wortteilung macht.Lösung für Bash Version 3 (und 4)
Ich war zufällig bei einer CentOS 5-Box mit Bash 3 angemeldet und hatte an einer Lösung gearbeitet. Ich habe die Antwort von cuonglm bereits positiv bewertet, aber ich dachte, ich könnte genauso gut die Lösung veröffentlichen, die ich gefunden habe und die mit Bash 3 (und 4) funktionieren sollte. Ich habe es mit einer Datei getestet, deren Name ein Leerzeichen enthält, und mit einer anderen, die mit beginnt
-
.Anstatt
Verwenden Sie einfach die Befehlssubstitution, um das Array zu erstellen und zu füllen:
Hinweis: Dies funktioniert nicht mit Dateinamen, deren Name Zeilenumbrüche enthält.
quelle
für
bash
Versionen, die nicht unterstützenmapfile
sollte den Trick machen
quelle