Para ler um arquivo de texto literalmente, não use plain read
, que processa a saída de duas maneiras:
read
interpreta \
como um caractere de escape; use read -r
para desativar isso.
read
divide-se em palavras nos caracteres $IFS
; defina IFS
como uma string vazia para desativar isso.
O idioma usual para processar um arquivo de texto linha por linha é
while IFS= read -r line; do …
Para obter uma explicação desse idioma, consulte Por que é while IFS= read
usado com tanta frequência, em vez de IFS=; while read..
? .
Para escrever uma string literalmente, não use simplesmente plain echo
, que processa a string de duas maneiras:
- Em algumas conchas, os
echo
processos de barra invertida escapam. (No bash, depende se a xpg_echo
opção está definida.)
- Algumas seqüências de caracteres são tratadas como opções, por exemplo,
-n
ou -e
(o conjunto exato depende do shell).
Uma maneira portátil de imprimir uma string é literalmente printf
. (Não há maneira melhor no bash, a menos que você saiba que sua entrada não parece uma opção echo
.) Use o primeiro formulário para imprimir a sequência exata e o segundo formulário se desejar adicionar uma nova linha.
printf %s "$line"
printf '%s\n' "$line"
Isso é adequado apenas para o processamento de texto , porque:
- A maioria dos shells engasga com caracteres nulos na entrada.
- Quando você lê a última linha, não tem como saber se havia uma nova linha no final ou não. (Alguns shells mais antigos podem ter problemas maiores se a entrada não terminar com uma nova linha.)
Você não pode processar dados binários no shell, mas as versões modernas de utilitários na maioria das unidades podem lidar com dados arbitrários. Para passar toda a entrada para a saída, use cat
. Entrar na tangente echo -n ''
é uma maneira complicada e não portátil de não fazer nada; echo -n
seria tão bom (ou não, dependendo do shell) e :
é mais simples e totalmente portátil.
: >| "$file"
cat >>"$file"
ou, mais simples,
cat >|"$file"
Em um script, você geralmente não precisa usar, >|
pois noclobber
está desativado por padrão.