web-dev-qa-db-fra.com

Redirection de la sortie de bash pour la boucle

J'ai une simple commande BASH qui ressemble à

for i in `seq 2`; do echo $i; done; > out.dat

Quand cela lance la sortie de seq 2 est sorti vers le terminal et rien n’est sorti dans le fichier de données (out.dat)

Je m'attends à ce que la sortie standard soit redirigée vers out.dat comme il le fait simplement en exécutant la commande seq 2 > out.dat

45
Matthew Kirkley

Supprimez votre point-virgule.

for i in `seq 2`; do echo "$i"; done > out.dat

SUGGESTIONS

Aussi, comme suggéré par Fredrik Pihl, essayez de ne pas utiliser de binaires externes quand ils ne sont pas nécessaires, ou du moins lorsque ce n’est pratiquement pas le cas:

for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat

Aussi, faites attention aux sorties dans words qui pourraient causer l’extension du chemin.

for A in $(echo '*'); do echo "$A"; done

Afficherait vos fichiers au lieu d'un littéral *.

$() est également recommandé comme syntaxe plus claire pour la substitution de commande dans les shells Bash et POSIX que pour les backticks (`), et prend en charge l'imbrication.

Les solutions plus propres pour la lecture des résultats en variables sont

while read VAR; do
    ...   
done < <(do something)

Et

read ... < <(do something)  ## Could be done on a loop or with readarray.

for A in "${ARRAY[@]}"; do
    :
done

L'utilisation de printf peut également être une alternative plus facile en ce qui concerne la fonction souhaitée:

printf '%s\n' {1..2} > out.dat
74
konsolebox

Une autre possibilité, par souci d’exhaustivité: vous pouvez déplacer la sortie dans la boucle à l’aide de >> à ajouter au fichier, s'il existe.

for i in `seq 2`; do echo $i >> out.dat; done;

Le meilleur choix dépend certainement du cas d'utilisation. Écrire le fichier en une fois est certainement préférable à l’annexer mille fois. De plus, si la boucle contient plusieurs instructions echo, qui doivent toutes aller dans le fichier, en faisant done > out.dat est probablement plus lisible et plus facile à maintenir. Bien entendu, l’avantage de cette solution est qu’elle offre plus de flexibilité.

7
tobias_k

Essayer:

(for i in `seq 2`; do echo $i; done;) > out.dat
5
svante