Tengo este script bash y he tenido un problema en la línea 16. ¿Cómo puedo tomar el resultado anterior de la línea 15 y añadirlo a la variable de la línea 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
Para los enteros:
Utilice expansión aritmética: $((EXPR))
num=$((num1 + num2))
num=$(($num1 + $num2)) # también funciona
num=$((num1 + 2 + 3)) # ...
num=$[num1+num2] # sintaxis de expresión aritmética antigua y obsoleta
Usando la utilidad externa expr
. Tenga en cuenta que esto sólo es necesario para los sistemas realmente antiguos.
num=`expr $num1 + $num2` # el espacio en blanco para expr es importante
Para punto flotante:
Bash no lo soporta directamente, pero hay un par de herramientas externas que puedes usar:
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
También puedes utilizar la notación científica (por ejemplo: 2.5e+2
)
Trampas comunes:
Cuando se establece una variable, no puede haber espacios en blanco a ambos lados de =
, de lo contrario se forzará al shell a interpretar la primera palabra como el nombre de la aplicación a ejecutar (ej.: num=
o num
)
num= 1
num =2
bc
y expr
esperan cada número y operador como un argumento separado, por lo que los espacios en blanco son importantes. No pueden procesar argumentos como 3+
+4
.
num=`expr $num1+ $num2`
Utilice la expansión aritmética $(( ))
.
num=$(( $num + $metab ))
Consulte http://tldp.org/LDP/abs/html/arithexp.html para obtener más información.
Hay mil y una formas de hacerlo. Aquí'hay una usando dc
:
dc <<<"$num1 $num2 + p"
Pero si eso'es demasiado bash-y para usted (o la portabilidad importa) usted podría decir
echo $num1 $num2 + p | dc
Pero tal vez seas una de esas personas que piensan que el RPN es asqueroso y raro; ¡no te preocupes! bc
está aquí para ti:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Dicho esto, hay algunas mejoras no relacionadas que podrías hacer en tu script
#!/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
EDITAR:
Como se describe en BASH FAQ 022, bash no soporta nativamente números de punto flotante. Si necesita sumar números de punto flotante se requiere el uso de una herramienta externa (como bc
o dc
).
En este caso la solución sería
num=$(dc <<<"$num $metab + p")
Para sumar los números de punto flotante posibles en num
.