2017-06-26 7 views
1

Nehmen Sie eine Datei file mit mehreren Zeilen.While-Schleife über Zeilen von Variable in bash

Nehmen Sie weiter an, dass ich jede Zeile mit einer while-Schleife durchschleifen möchte.

Schließlich, bitte gehen Sie davon aus, dass ich in einer Variablen gespeicherte Zeilen lieber als Zeilen in einer Datei gespeichert übergeben möchte. Wie kann ich Zeilen, die als Variable gespeichert sind, durchlaufen, ohne den folgenden Fehler zu erhalten?

$ MY_VAR=$(cat file) 
$ while IFS= read -r line; do 
$ echo $line 
$ # do stuff 
$ done < $(echo "$MY_VAR") 
bash: $(echo "$MY_VAR"): ambiguous redirect 
+0

'echo $ line' ist nicht das gleiche wie' echo "$ line" '. Siehe [BashPitfalls # 14] (http://mywiki.wooledge.org/BashPitfalls#echo_.24foo). –

+0

Außerdem werden Variablennamen mit Großbuchstaben für Variablen verwendet, die eine Bedeutung für die Shell oder das Betriebssystem haben, während Namen mit Kleinbuchstaben garantiert nicht mit dem Systembetrieb kollidieren. Siehe http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html, vierter Absatz. –

Antwort

1

Sie haben mehrere Möglichkeiten:

  • A herestring (beachten Sie, dass dies ein nicht-POSIX-Erweiterung): done <<<"$MY_VAR"
  • A heredoc (POSIX-konform, wird mit /bin/sh arbeiten):

    done <<EOF 
    $MY_VAR 
    EOF 
    
  • Eine Prozesssubstitution (auch eine Erweiterung, aber mit printf anstatt echo macht es vorhersagbarer über Shells hinweg, die es unterstützen; finden Sie in der Anwendungsnutzung Note im POSIX spec for echo): done < <(printf '%s\n' "$MY_VAR")


Beachten Sie, dass die ersten beiden Optionen (in bash) erstellen eine temporäre Datei auf der Festplatte mit dem Inhalt der Variable, während der letzte einen FIFO verwendet .

+0

Danke für die ausführlichen Erklärungen sowie die nützlichen Kommentare oben. Sehr geschätzt. –

1

< muss ein Dateiname folgen. Sie können eine Heredoc verwenden:

done <<< "$MY_VAR" 

oder Prozess Substitution:

done < <(echo "$MY_VAR")