7
votes

Déclarations de mathématiques simples dans Bash dans A pour boucle

Je suis tout à fait nouveau pour baster les scripts et évitez généralement tous les coûts, mais j'ai besoin d'écrire un script Bash pour exécuter des choses simples sur un cluster distant. J'ai des problèmes avec A pour une boucle qui suit:

for i in {1..20}
do
    for j in {1..20}
    do
        echo (i*i + j*j ) **.5  <--- Pseudo code!
    done
done


0 commentaires

11 Réponses :


1
votes

Utilisez Double Paren pour évaluer une variable.

variables = $ (variable * variable))

Seulement pour l'INT.


0 commentaires

0
votes

Généralement, vous utiliseriez $ ((1 * 3)), mais votre cas ne fonctionnerait pas comme BASH ne prend pas en charge les numéros de points flottants. Vous devrez utiliser un outil externe comme AWK, BC ou DC: http://mywiki.woolgedge.org/bashfaq/022


0 commentaires

2
votes

Shell Math peut être effectué de plusieurs manières. XXX

Cependant, cela ne peut gérer que des arithmétiques entier. Au lieu de cela, vous pouvez utiliser bc : xxx

modifier échelle au nombre de décimales souhaitée.


3 commentaires

Vous manquez probablement le .. entre vos 1 et 20 dans votre plage {1..20}


Weird, il devrait fonctionner dans n'importe quel POSIX BC . Et si vous utilisez dc ? I.e. DC -E "5 K $ i $ i $ i * $ j $ j * + v p"


Bah. J'ai raccourcé la boucle J afin que cela n'allait pas l'écran et introduisait une faute de frappe.



12
votes

a besoin d'expansion arithmétique $ ((...)) notation, alors quelque chose comme: xxx

Cependant, Bash utilise uniquement des entiers afin que vous ayez peut-être besoin d'utiliser un outil externe tel que dc.

par exemple xxx


0 commentaires

0
votes

Le code xxx

fonctionnera si $ x est un entier. Vous essayez de prendre la racine carrée et je ne sais pas si l'arithmétique intégrée de Bash le fera. Vous serez probablement mieux en train d'utiliser un outil de calculateur plus puissant (comme BC , et al.) Pour cela.


0 commentaires

2
votes
#!/bin/bash
for i in {1..20}; do
    for j in {1..20}; do
        echo 5k$i $i\* $j $j\*+vp | dc
    done
done

1 commentaires

Ma variante: printf "% s% s 10kd * rd * + vp" "$ i" "$ j" | CC



8
votes

Voici une solution décente:

1.414
2.236
3.162
2.236
[...etc...]


0 commentaires

0
votes

bash ne propose pas de fonctions mathématiques. Cependant, vous avez presque certainement l'installation de Korn Shell. Cela devrait fonctionner: xxx

Le début de la sortie est xxx


3 commentaires

"presque certainement"? Certainement pas standard sur une distribution Linux que j'ai vue. Peut-être que vous voulez dire * bsd?


ksh est sur Fedora et Centos.


Il est disponible en tant que package, mais ne partie pas de l'installation par défaut. La plupart des systèmes Linux utilisent Bash comme coquille par défaut; Les BSD ont tendance à graviter autour de divers coquilles non-GNU.



-1
votes

Une autre forme d'expressions mathématiques entier dans Bash met les deux parenthèses à l'extérieur de l'expression complète des opérations d'affectation: xxx

Comme vous pouvez le constater, les signes de dollar ne sont pas nécessaires ici (ni intérieur $ (()) ). En outre, les espaces sont autorisés autour du signe égal.

En outre, ce formulaire peut être utilisé dans des conditionnels: xxx

ou vous pouvez remplacer tout cela avec ceci , bien sûr: xxx

bash a également un let instruction: xxx


0 commentaires

1
votes

Votre groupe distant n'a-t-il que Bash? Si non, essayez de voir si vous avez AWK

awk 'BEGIN{
  for(i=1;i<=20;i++){
    for(j=1;j<=20;j++){
       print ( i*i + j*j ) ** 0.5
    }
  }
}'


0 commentaires

0
votes

avec ZSH, cela fonctionnera

for i in {1..20};do
  for j in {1..20};do
     echo $((($i*$i + $j*$j)**.5))
  done
done


0 commentaires