boucles Shell en utilisant des non-entiers?
Question
J'ai écrit un fichier .sh pour compiler et exécuter quelques programmes pour une affectation de devoirs. J'ai une boucle « pour » dans le script, mais il ne fonctionnera pas à moins d'utiliser uniquement des nombres entiers:
#!/bin/bash
for (( i=10; i<=100000; i+=100))
do
./hw3_2_2 $i
done
La variable i est $ l'entrée pour le hw3_2_2 du programme, et j'ai des valeurs non entières que je voudrais utiliser. Comment pourrais-je boucle à travers l'exécution du code avec une liste de nombres décimaux?
La solution
Je trouve surprenant que, dans cinq ans, personne n'a jamais mentionné l'utilitaire créé juste pour générer des plages, mais, là encore, il vient de BSD vers 2005, et peut-être même pas été généralement disponible sous Linux au moment de la question a été fait.
Mais ici il est:
for i in $(seq 0 0.1 1)
Ou, pour imprimer tous les numéros avec la même largeur (ou par préfixer annexant zéros), utilisez -w
. Cela aide à prévenir les numéros étant envoyés comme des « entiers », si cela causerait des problèmes.
La syntaxe est seq [first [incr]] last
, avec first
défaillant à 1, et incr
défaillant soit 1 ou -1, selon que last
est supérieure ou inférieure à first
. Pour les autres paramètres, voir suivants (1) .
Autres conseils
vous pouvez utiliser awk pour générer vos décimales, par exemple les étapes of0.1
num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}')
for n in $num
do
./hw3_2_2 $n
done
ou vous pouvez le faire entièrement en awk
awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }'
La façon la plus simple est de lister simplement les:
for a in 1.2 3.4 3.11 402.12 4.2 2342.40
do
./hw3_2_2 $a
done
Si la liste est énorme, donc vous ne pouvez pas avoir une liste littérale, il considérer le dumping dans un fichier, puis en utilisant quelque chose comme
for a in $(< my-numbers.txt)
do
./hw3_2_2 $a
done
$ (
Voici une autre façon. Vous pouvez utiliser un doc ici pour inclure vos données dans le script:
read -r -d '' data <<EOF
1.1
2.12
3.14159
4
5.05
EOF
for i in "$data"
do
./hw3_2_2 "$i"
done
De même:
array=(
1.1
2.12
3.14159
4
5.05
)
for i in "${array[@]}"
do
./hw3_2_2 "$i"
done
Je habituellement utilise aussi « suivants » selon la deuxième réponse, mais juste pour donner une réponse en termes d'une boucle entière précision robuste et bc conversion à un flotteur:
#!/bin/bash
for i in {2..10..2} ; do
x=`echo "scale=2 ; ${i}/10" | bc`
echo $x
done
donne:
0,2 .4 0,6 .8 1.0