Per leggere un file di testo letteralmente, non usare plain read
, che elabora l'output in due modi:
read
interpreta \
come un personaggio di fuga; usare read -r
per disattivarlo.
read
si divide in parole sui personaggi in $IFS
; impostato IFS
su 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= read
usato 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
echo
processi backslash escono. (Su bash, dipende se l' xpg_echo
opzione è impostata.)
- Alcune stringhe vengono trattate come opzioni, ad esempio
-n
o -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 -n
sarebbe 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.