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.