Pour lire un fichier texte littéralement, n'utilisez pas plain read
, qui traite la sortie de deux manières:
read
interprète \
comme un personnage d'échappement; utiliser read -r
pour désactiver cette fonction.
read
se divise en mots sur les caractères en $IFS
; défini IFS
sur une chaîne vide pour désactiver cette option.
L'idiome habituel pour traiter un fichier texte ligne par ligne est
while IFS= read -r line; do …
Pour une explication de cet idiome, voir Pourquoi est-il while IFS= read
utilisé si souvent au lieu de IFS=; while read..
? .
Pour écrire une chaîne littéralement, n'utilisez pas simplement plain echo
, qui traite la chaîne de deux manières:
- Sur certains shells, les
echo
processus anti-slash s'échappent. (Sur bash, cela dépend si l' xpg_echo
option est définie.)
- Quelques chaînes sont traitées comme des options, par exemple
-n
ou -e
(l'ensemble exact dépend du shell).
Une façon portable d'imprimer une chaîne est littéralement avec printf
. (Il n'y a pas de meilleur moyen en bash, sauf si vous savez que votre entrée ne ressemble pas à une option echo
.) Utilisez le premier formulaire pour imprimer la chaîne exacte, et le second formulaire si vous souhaitez ajouter une nouvelle ligne.
printf %s "$line"
printf '%s\n' "$line"
Cela ne convient que pour le traitement de texte , car:
- La plupart des shells s'étoufferont avec des caractères nuls dans l'entrée.
- Lorsque vous avez lu la dernière ligne, vous n'avez aucun moyen de savoir s'il y avait une nouvelle ligne à la fin ou non. (Certains shells plus anciens peuvent avoir de plus gros problèmes si l'entrée ne se termine pas par une nouvelle ligne.)
Vous ne pouvez pas traiter les données binaires dans le shell, mais les versions modernes des utilitaires sur la plupart des unités peuvent gérer des données arbitraires. Pour passer toutes les entrées à la sortie, utilisez cat
. Aller sur une tangente, echo -n ''
est une façon compliquée et non portable de ne rien faire;echo -n
serait tout aussi bon (ou non selon le shell), et :
est plus simple et entièrement portable.
: >| "$file"
cat >>"$file"
ou, plus simple,
cat >|"$file"
Dans un script, vous n'avez généralement pas besoin d'utiliser >|
car il noclobber
est désactivé par défaut.