2017-12-31 30 views
1

Ich habe eine Eingabe von Datei lesen:

declare -a ARR  
    readarray -t ARR < <(cat /etc/passwd | tr "\n" "\n") 

Dies druckt es in Ordnung, aber ich möchte jede Zeile zuzugreifen:

printf '%s\n' "${ARR[@]} 

Dies ist der Eingang auf Räume aufgeteilt:

for i in ${ARR[@]}; do 
     echo ${i} 
    done 

Erfordert echo eine bestimmte Option, um es richtig zu drucken? Basiert auf this answer, sollte es zu echo "${i}" ändern es beheben, aber es tut es nicht. Dies hat das gleiche Problem:

printf "${i} \n" 
+2

Was soll "tr" \ n "" \ n "' erreichen? –

Antwort

2

Zur Spaltung auf Räume zu vermeiden, ersetzen:

for i in ${ARR[@]}; do 

mit:

for i in "${ARR[@]}"; do 

Ohne die doppelten Anführungszeichen, hat die Schale Wort spalt .

Es wäre auch am besten, echo ${i} durch echo "${i}" zu ersetzen. Ohne die doppelten Anführungszeichen wird die ${i} einer Wortaufspaltung unterzogen (wodurch mehrere Leerstellen auf eine Leerstelle reduziert werden) und Pfadnamenerweiterung (was dazu führen kann, dass Wörter mit Shell-aktiven Zeichen durch Dateinamen aus der aktuellen ersetzt werden) Verzeichnis).

+1

Die meisten Variablen-/Array-/Befehlserweiterungen sollten in doppelten Anführungszeichen stehen. Es gibt einige Situationen, in denen es sicher ist, die doppelten Anführungszeichen zu verlassen, aber IMO, es ist mehr Mühe zu behalten, wo es sicher ist, als es immer nur doppelte Anführungszeichen zu verwenden. –

+0

Beachten Sie, dass "$ {ARR [*]}" in doppelten Anführungszeichen das erste Zeichen von $ IFS für sein Trennzeichen verwendet. – cdarke

Verwandte Themen