Utilisez la while read
boucle:
: > another_file ## Truncate file.
while IFS= read -r LINE; do
command --option "$LINE" >> another_file
done < file
Une autre consiste à rediriger la sortie par bloc:
while IFS= read -r LINE; do
command --option "$LINE"
done < file > another_file
Le dernier consiste à ouvrir le fichier:
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
Si l'une des commandes lit l'entrée, ce serait une bonne idée d'utiliser un autre fichier fd pour que l'entrée ne le mange pas (ici en supposant ksh
, zsh
ou bash
pour -u 3
, utilisez <&3
plutôt portable):
while IFS= read -ru 3 LINE; do
...
done 3< file
Enfin pour accepter les arguments, vous pouvez faire:
#!/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"
Lequel pourrait fonctionner comme:
bash script.sh file another_file
Idée supplémentaire. Avec bash
, utilisez readarray
:
readarray -t LINES < "$FILE"
for LINE in "${LINES[@]}"; do
...
done
Remarque: vous IFS=
pouvez l'omettre si vous ne craignez pas de supprimer les valeurs de ligne des espaces de début et de fin.
<file xargs -L 1 -I{} command --option {} other args