2013-08-15 5 views
0

Je suis en train d'exécuter un script bash qui comprend une imbriqué pour boucle dans laquelle une variable doit passer en revue les exposants négatifs, à savoir:script Bash utilisant négatif pour faire défiler

for ABPOW in {-11..-9} 
do 
ABC = $((10**$ABPOW)) 
      for ABCOEFF in {1..9} 
      do 
       sed -e 's/ACOEFF/'$ABC'/'\ 

Ce n'est que les deux intérieure pour les boucles du code. Lorsque les valeurs dans la première parenthèse (pour ABPOW) sont positives, le code fonctionne bien. Cependant, quand je les ai comme je le fais ci-dessus, qui est ce que j'ai besoin, l'erreur est communiqué à l'écran:

./scripting_test2.bash: line 30: 10**-11: exponent less than 0 (error token is "1") 

Comment puis-je faire cette course? Merci d'avance.

PS: J'ai essayé de mettre un signe négatif devant $ABPOW mais les exposants sont toujours pas considérés comme positifs.

Répondre

1

Bash ne supporte pas l'arithmétique en virgule flottante (ce qui est nécessaire pour élever quelque chose dans une puissance négative). Au lieu de cela, vous devez utiliser l'utilitaire bc.

ABC=$(bc -l <<< "10 ^($ABPOW)") 

En outre, il devrait y avoir aucun espace avant et après la = dans les affectations variables

+0

Merci user000001. Dans le fichier où ces valeurs sont sauvegardées, j'obtiens la valeur correcte après avoir utilisé le code que vous avez indiqué ci-dessus, mais il est sous la forme: abundance = 4 * .00000000001000000000; Tous les zéros supplémentaires après la position du 1 n'ont pas de sens? – stars83clouds

+0

@ stars83clouds Pas vraiment possible d'enlever les zéros de fin avec 'bc' AFAIK. Mais vous pouvez utiliser 'awk', comme par exemple:' ABC = $ (awk '{print 10^$ 1}' <<< "$ ABPOW") ' – user000001

1

Bash ne prend pas en charge les types de données à virgule flottante.

$ man bash|grep -c -i float 
0 

Avez-vous installé python?

ABC=$(python -c "print 10**$ABPOW") 
+0

Oui, python est installé. Une question cependant, puis-je modifier la ligne dans le script bash afin qu'il appelle python pour effectuer ce qui précède? Ou devrais-je réécrire le script en python? – stars83clouds

+0

Vous pouvez le modifier comme je l'ai montré dans cette réponse. La ligne 'ABC =' est ce que vous pouvez utiliser à la place. –

1

Voici une autre façon:

perl -e 'for $abpow (-11..-9) { $abc=10**$abpow; for (1..9) { system("echo $abc"); } }'

1

Une alternative consiste à utiliser awk pour votre script complet qui a un support complet pour l'arithmétique à virgule flottante:

awk 'BEGIN{for(i=-11; i<=-9; i++) {ABC=10^i; print ABC}}' 
1e-11 
1e-10 
1e-09 
Questions connexes