Use while read
loop:
: > another_file ## Truncate file.
while read -r LINE; do
command --option "$LINE" >> another_file
done < file
Outra é redirecionar a saída por bloco:
while read -r LINE; do
command --option "$LINE"
done < file > another_file
Por último, é para abrir o arquivo:
exec 4> another_file
while read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Se um dos comandos ler entrada, seria uma boa ideia usar outro fd para entrada, para que os comandos não o comam (aqui assumindo ksh
, zsh
ou bash
para -u 3
, use <&3
em vez de portável):
while read -ru 3 LINE; do
...
done 3< file
Finalmente, para aceitar argumentos, você pode fazer:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Qual deles poderia ser executado como:
bash script.sh file another_file
Ideia extra. Com bash
, use readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Observação: não é necessário redefinir o valor de IFS
(ou seja, IFS= read
) quando usar apenas um único parâmetro.