Використовуйте 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