Используйте while read
цикл:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Другой - перенаправить вывод по блокам:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Последнее, чтобы открыть файл:
exec 4> another_file
while IFS= read -r LINE; do
command --option "$LINE" >&4
echo xyz ## Another optional command that sends output to stdout.
done < file
Если одна из команд читает входные данные, было бы неплохо использовать другой fd для ввода, чтобы команды не сожрали его (здесь предполагается ksh
, zsh
или bash
для -u 3
, <&3
вместо этого используйте переносимо):
while IFS= read -ru 3 LINE; do
...
done 3< file
Наконец, чтобы принять аргументы, вы можете сделать:
#!/bin/bash
FILE=$1
ANOTHER_FILE=$2
exec 4> "$ANOTHER_FILE"
while IFS= read -ru 3 LINE; do
command --option "$LINE" >&4
done 3< "$FILE"
Какой из них может работать как:
bash script.sh file another_file
Дополнительная идея С bash
помощью readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Примечание: IFS=
может быть опущено, если вы не возражаете против того, чтобы значения строк обрезались от начальных и конечных пробелов.
<file xargs -L 1 -I{} command --option {} other args