Um eine Textdatei buchstäblich zu lesen, verwenden Sie nicht plain read, da dies die Ausgabe auf zwei Arten verarbeitet:
readinterpretiert \als Fluchtzeichen; Verwenden Sie read -r, um dies auszuschalten.
readteilt sich in Wörter auf Zeichen in $IFS; Stellen Sie IFSeine 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= readso 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
echoBackslash auf. (Bei Bash hängt es davon ab, ob die xpg_echoOption aktiviert ist.)
- Einige Zeichenfolgen werden als Optionen behandelt, z. B.
-noder -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 -nwä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 noclobberes standardmäßig deaktiviert ist.