Um eine Textdatei buchstäblich zu lesen, verwenden Sie nicht plain read
, da dies die Ausgabe auf zwei Arten verarbeitet:
read
interpretiert \
als Fluchtzeichen; Verwenden Sie read -r
, um dies auszuschalten.
read
teilt sich in Wörter auf Zeichen in $IFS
; Stellen Sie IFS
eine leere Zeichenfolge ein, um dies zu deaktivieren.
Die übliche Sprache, um eine Textdatei zeilenweise zu verarbeiten, ist
while IFS= read -r line; do …
Eine Erklärung dieser Redewendung finden Sie unter Warum wird while IFS= read
so oft anstelle von verwendet IFS=; while read..
?. .
Um eine Zeichenfolge wörtlich zu schreiben, verwenden Sie nicht nur plain echo
, sondern verarbeiten die Zeichenfolge auf zwei Arten:
- Bei einigen Shells tritt ein
echo
Backslash auf. (Bei Bash hängt es davon ab, ob die xpg_echo
Option aktiviert ist.)
- Einige Zeichenfolgen werden als Optionen behandelt, z. B.
-n
oder -e
(die genaue Menge hängt von der Shell ab).
Ein portabler Weg, eine Zeichenkette buchstäblich zu drucken, ist mit printf
. (Es gibt keinen besseren Weg in bash, es sei denn, Sie wissen, dass Ihre Eingabe nicht wie eine Option für aussieht echo
.) Verwenden Sie das erste Formular, um die genaue Zeichenfolge zu drucken, und das zweite Formular, wenn Sie eine neue Zeile hinzufügen möchten.
printf %s "$line"
printf '%s\n' "$line"
Dies ist nur geeignet für die Verarbeitung von Text , denn:
- Die meisten Shells verschlucken sich an Nullzeichen in der Eingabe.
- Wenn Sie die letzte Zeile gelesen haben, können Sie nicht wissen, ob am Ende eine neue Zeile vorhanden war oder nicht. (Einige ältere Shells haben möglicherweise größere Probleme, wenn die Eingabe nicht mit einer neuen Zeile endet.)
Sie können keine Binärdaten in der Shell verarbeiten, aber moderne Versionen von Dienstprogrammen auf den meisten Unices können mit beliebigen Daten umgehen. Verwenden Sie, um alle Eingaben an die Ausgabe weiterzuleiten cat
. Sich auf eine Tangente zu begeben, echo -n ''
ist eine komplizierte und nicht tragbare Art, nichts zu tun. echo -n
wäre genauso gut (oder nicht abhängig von der Shell), und :
ist einfacher und vollständig portabel.
: >| "$file"
cat >>"$file"
oder einfacher
cat >|"$file"
In einem Skript müssen Sie normalerweise nicht verwenden, >|
da noclobber
es standardmäßig deaktiviert ist.