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
11 Réponses :
Utilisez Double Paren pour évaluer une variable. P>
variables = $ (variable * variable)) p>
Seulement pour l'INT. P>
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 p>
Shell Math peut être effectué de plusieurs manières. Cependant, cela ne peut gérer que des arithmétiques entier. Au lieu de cela, vous pouvez utiliser modifier bc code>: p>
échelle code> au nombre de décimales souhaitée. P> p>
Vous manquez probablement le .. code> entre vos 1 et 20 dans votre plage {1..20}
Weird, il devrait fonctionner dans n'importe quel POSIX BC CODE>. Et si vous utilisez
dc code>? I.e.
DC -E "5 K $ i $ i $ i * $ j $ j * + v p" code>
Bah. J'ai raccourcé la boucle J afin que cela n'allait pas l'écran et introduisait une faute de frappe.
a besoin d'expansion arithmétique Cependant, Bash utilise uniquement des entiers afin que vous ayez peut-être besoin d'utiliser un outil externe tel que dc. p> par exemple p> $ ((...)) code> notation, alors quelque chose comme:
Le code fonctionnera si $ x code> 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 code>, et al.) Pour cela. P> P>
#!/bin/bash for i in {1..20}; do for j in {1..20}; do echo 5k$i $i\* $j $j\*+vp | dc done done
Ma variante: printf "% s% s 10kd * rd * + vp" "$ i" "$ j" | CC code>
Voici une solution décente:
1.414 2.236 3.162 2.236 [...etc...]
bash ne propose pas de fonctions mathématiques. Cependant, vous avez presque certainement l'installation de Korn Shell. Cela devrait fonctionner: Le début de la sortie est p>
"presque certainement"? Certainement pas standard sur une distribution Linux que j'ai vue. Peut-être que vous voulez dire * bsd?
ksh code> 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.
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: Comme vous pouvez le constater, les signes de dollar ne sont pas nécessaires ici (ni intérieur En outre, ce formulaire peut être utilisé dans des conditionnels: p> ou vous pouvez remplacer tout cela avec ceci , bien sûr: p> bash a également un $ (()) code>). En outre, les espaces sont autorisés autour du signe égal. P>
let code> instruction: p>
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 } } }'
avec ZSH, cela fonctionnera
for i in {1..20};do for j in {1..20};do echo $((($i*$i + $j*$j)**.5)) done done