Je cherche à écrire un script qui prend un .txt
filename comme argument, lit le fichier ligne par ligne et passe chaque ligne à une commande. Par exemple, il exécute la command --option "LINE 1"
, puis command --option "LINE 2"
, etc. La sortie de la commande est écrite dans un autre fichier. Comment est-ce que je fais ça ? Je ne sais pas par où commencer.
Réponse acceptée :
Utiliser 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 est d'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 fd pour l'entrée afin que les commandes ne la mangent pas (ici en supposant ksh
, zsh
ou bash
pour -u 3
, utilisez <&3
à la place 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 s'exécuter en tant que :
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 :IFS=
peut être omis si cela ne vous dérange pas que les valeurs de ligne soient supprimées des espaces de début et de fin.