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
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
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é.
Essayer:
(for i in `seq 2`; do echo $i; done;) > out.dat