Ich habe eine Variable, die eine durch Leerzeichen getrennte Zeichenfolge enthält:
line="1 1.50 string"
Ich möchte diese Zeichenfolge mit Leerzeichen als Trennzeichen teilen und das Ergebnis in einem Array speichern, so dass Folgendes:
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
Ausgänge
1
1.50
string
Irgendwo habe ich eine Lösung gefunden, die nicht funktioniert:
arr=$(echo ${line})
Wenn ich danach die obigen Echoanweisungen ausführe, erhalte ich:
1 1.50 string
[empty line]
[empty line]
Ich habe es auch versucht
IFS=" "
arr=$(echo ${line})
mit dem gleichen Ergebnis. Kann mir bitte jemand helfen?
set -f; arr=($string); set +f
scheint schneller zu sein alsread -r -a <<< $string
.Antworten:
Um einen String in ein Array zu konvertieren, verwenden Sie bitte
oder
Es ist wichtig, keine Anführungszeichen zu verwenden, da dies den Trick macht.
quelle
for i in ${arr[@]}; do echo $i; done
echo ${arr[@]}
$line
Globbing-Zeichen enthalten sind.mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}
gibt 3declare -a "arr=($line)"
wirdIFS
Trennzeichen in Anführungszeichen ignorierenline='*'
,read -a arr <<<$line
immer, aber nurarr=($line)
versagt.Versuche dies:
quelle
line='*'
In :
arr=( $line )
. Die "Aufteilung" ist mit "glob" verbunden.Platzhalter (
*
,?
und[]
) werden auf übereinstimmende Dateinamen erweitert.Die richtige Lösung ist nur geringfügig komplexer:
Kein Globbing-Problem; Das geteilte Zeichen wird in
$IFS
Variablen gesetzt.quelle
arr=($line)
in der akzeptierten Antwort leidet unter globalen Problemen. Versuchen Sie zum Beispiel :line="twinkling *"; arr=($line); declare -p arr
.<<<
es kann jedoch eine gute Idee sein, aus Gründen der Konsistenz und Lesbarkeit weiterhin doppelte Anführungszeichen zu verwenden.Wenn Sie eine Parametererweiterung benötigen, versuchen Sie Folgendes:
Nehmen Sie zum Beispiel den folgenden Code.
Wenn das aktuelle Verzeichnis enthaltenen Dateien
a.txt
,b.txt
undc.txt
dann die Ausführung von Code würde die folgende Ausgabe erzeugen.quelle
quelle
tr
ist überflüssig, aber es sollte"${arr[@]}"
stattdessen eine Schleife$arr