Usa while read
loop:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Un altro è reindirizzare l'output per blocco:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
L'ultimo è aprire il 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
Se uno dei comandi legge l'input, sarebbe una buona idea usare un altro fd per l'input in modo che i comandi non lo mangino (qui assumendo ksh
, zsh
o bash
per -u 3
, usare <&3
invece portabilmente):
while IFS= read -ru 3 LINE; do
...
done 3< file
Infine, per accettare gli argomenti, puoi fare:
#!/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"
Quale potrebbe essere eseguito come:
bash script.sh file another_file
Idea extra. Con bash
, utilizzare readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Nota: IFS=
può essere omesso se non ti dispiace avere valori di linea tagliati di spazi iniziali e finali.
<file xargs -L 1 -I{} command --option {} other args