Per leggere un file di testo letteralmente, non usare plain read, che elabora l'output in due modi:
readinterpreta \come un personaggio di fuga; usare read -rper disattivarlo.
readsi divide in parole sui personaggi in $IFS; impostato IFSsu una stringa vuota per disattivarlo.
Il solito linguaggio per elaborare un file di testo riga per riga è
while IFS= read -r line; do …
Per una spiegazione di questo linguaggio, vedi Perché viene while IFS= readusato così spesso, invece di IFS=; while read..? .
Per scrivere una stringa letteralmente, non usare semplicemente plain echo, che elabora la stringa in due modi:
- Su alcune shell, i
echoprocessi backslash escono. (Su bash, dipende se l' xpg_echoopzione è impostata.)
- Alcune stringhe vengono trattate come opzioni, ad esempio
-no -e(il set esatto dipende dalla shell).
Un modo portatile di stampare una stringa è letteralmente con printf. (Non c'è modo migliore in bash, a meno che tu non sappia che il tuo input non sembra un'opzione echo.) Usa il primo modulo per stampare la stringa esatta e il secondo modulo se vuoi aggiungere una nuova riga.
printf %s "$line"
printf '%s\n' "$line"
Questo è adatto solo per l'elaborazione del testo , perché:
- La maggior parte delle shell si strozzerà con caratteri null nell'input.
- Quando hai letto l'ultima riga, non hai modo di sapere se alla fine c'era una nuova riga. (Alcune shell meno recenti potrebbero avere problemi maggiori se l'input non termina con una nuova riga.)
Non è possibile elaborare dati binari nella shell, ma le versioni moderne dei programmi di utilità sulla maggior parte degli unici possono far fronte a dati arbitrari. Per passare tutto l'input all'output, utilizzare cat. Andare su una tangente echo -n ''è un modo complicato e non portatile di non fare nulla; echo -nsarebbe altrettanto buono (o meno a seconda della shell), ed :è più semplice e completamente portatile.
: >| "$file"
cat >>"$file"
o, più semplice,
cat >|"$file"
In uno script, di solito non è necessario utilizzare >|poiché noclobberè disattivato per impostazione predefinita.