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?

Était-ce utile?

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

$ (cat externe pour cela.

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

bash ne fait pas des nombres décimaux. Soit utiliser quelque chose comme bc qui peut, ou passer à un langage de programmation plus complète. Méfiez-vous des href="http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems" bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top