J'ai ce script bash et j'ai eu un problème à la ligne 16. Comment puis-je prendre le résultat précédent de la ligne 15 et l'ajouter à la variable de la ligne 16 ?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Pour les entiers :
Utilisez [l'expansion arithmétique][1] : $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # fonctionne aussi
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # ancienne syntaxe d'expression arithmétique dépréciée
Utilisation de l'utilitaire externe expr
. Notez que ceci n'est nécessaire que pour les très vieux systèmes.
num=``expr $num1 + $num2` # l'espacement pour expr est important
Pour la virgule flottante :
Bash ne le prend pas directement en charge, mais il existe quelques outils externes que vous pouvez utiliser :
num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc) # whitespace for echo is important
Vous pouvez également utiliser la notation scientifique (par exemple : 2.5e+2
)
Ecueils courants :
Lorsque vous définissez une variable, vous ne pouvez pas avoir d'espace de part et d'autre de =
, sinon cela forcera le shell à interpréter le premier mot comme le nom de l'application à exécuter (ex : num=
ou num
).
num= 1
num =2
bc
et expr
attendent chaque nombre et opérateur comme un argument séparé, donc l'espacement est important. Ils ne peuvent pas traiter des arguments comme 3+
+4
.
num=`expr $num1+ $num2`
Utilisez l'expansion arithmétique $(( ))
.
num=$(( $num + $metab ))
Voir http://tldp.org/LDP/abs/html/arithexp.html pour plus d'informations.
Il y a mille et une façons de le faire. En voici une qui utilise dc
:
dc <<<"$num1 $num2 + p"
Mais si cela est trop basique pour vous (ou si la portabilité est importante), vous pouvez dire
echo $num1 $num2 + p | dc
Mais peut-être faites-vous partie de ces gens qui pensent que RPN est dégoûtant et bizarre ; ne vous inquiétez pas ! bc
est là pour vous :
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Ceci dit, il y a quelques améliorations sans rapport avec votre script que vous pourriez faire
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in output-$i-* ; do # for can glob directly, no need to ls
echo "$j"
# grep can read files, no need to use cat
metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
num=$(( $num + $metab ))
done
echo "$num"
done
EDIT :
Comme décrit dans BASH FAQ 022, bash ne supporte pas nativement les nombres à virgule flottante. Si vous avez besoin d'additionner des nombres à virgule flottante, l'utilisation d'un outil externe (comme bc
ou dc
) est nécessaire.
Dans ce cas, la solution serait
num=$(dc <<<"$num $metab + p")
Pour ajouter des nombres à virgule flottante dans num
.