Tengo este script de Bash y tuve un problema en la línea 16. ¿Cómo puedo tomar el resultado anterior de la línea 15 y agregarlo a la variable en 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
Respuestas:
Para enteros :
Usar expansión aritmética :
$((EXPR))
Usando la
expr
utilidad externa . Tenga en cuenta que esto solo es necesario para sistemas realmente antiguos.Para coma flotante :
Bash no lo admite directamente, pero hay un par de herramientas externas que puede usar:
También puede usar notación científica (por ejemplo
2.5e+2
).Errores comunes :
Al establecer una variable, no puede tener espacios en blanco a ambos lados
=
, de lo contrario, forzará al shell a interpretar la primera palabra como el nombre de la aplicación que se ejecutará (por ejemplo,num=
onum
)num= 1
num =2
bc
yexpr
espere cada número y operador como un argumento separado, por lo que el espacio en blanco es importante. No pueden procesar argumentos como3+
+4
.num=`expr $num1+ $num2`
fuente
num1
ynum2
existían y tenían valores enteros?$((..))
evaluación aritmética se ejecuta en bash.expr
se ejecuta como un proceso separado, por lo que será mucho más lento. use el último en sistemas donde no se admite la evaluación aritmética (sh! = bash)$((…))
está estandarizado por POSIX, debería ser cada vez más raro queexpr
sea necesario.Usa la
$(( ))
expansión aritmética.Consulte el Capítulo 13. Expansión aritmética para obtener más información.
fuente
191.003 + 190
.Hay mil y una formas de hacerlo. Aquí hay uno que usa
dc
(una calculadora de escritorio de pulido inverso que admite aritmética de precisión ilimitada):Pero si eso es demasiado tímido para ti (o la portabilidad es importante), podrías decir
Pero tal vez eres una de esas personas que piensa que RPN es asqueroso y extraño; no te preocupes!
bc
está aquí para ti:Dicho esto, hay algunas mejoras no relacionadas que podría estar haciendo en su script:
Como se describe en la Pregunta frecuente 022 de Bash, Bash no admite de forma nativa números de coma flotante. Si necesita sumar números de coma flotante, se requiere el uso de una herramienta externa (como
bc
odc
).En este caso la solución sería
Para agregar acumular números de punto flotante posiblemente en
num
.fuente
En bash,
Tenga en cuenta que bash solo puede manejar aritmética de enteros, por lo que si su comando awk devuelve una fracción, entonces querrá rediseñar: aquí está su código reescrito un poco para hacer todas las matemáticas en awk.
fuente
Siempre olvido la sintaxis, así que vengo a google, pero nunca encuentro la que conozco: P. Esto es lo más limpio para mí y más fiel a lo que esperaría en otros idiomas.
fuente
fuente
También me gusta mucho este método, menos desorden:
fuente
Debe declarar metab como entero y luego usar la evaluación aritmética
Para obtener más información, consulte https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
fuente
Otra forma portátil
POSIX
de hacerlobash
, que se puede definir como una función.bashrc
para todos los operadores aritméticos de conveniencia.y solo llámalo en la línea de comandos como,
La idea es usar el Separador de campo de entrada (IFS) , una variable especial que se
bash
usa para dividir palabras después de la expansión y para dividir líneas en palabras. La función cambia el valor localmente para usar el carácter de división de palabras como operador de suma+
.Recuerde que
IFS
se cambia localmente y NO tiene efecto en elIFS
comportamiento predeterminado fuera del alcance de la función. Un extracto de laman bash
página,El
"$(( $* ))"
representa la lista de argumentos que se pasan a ser dividida por+
y más tarde el valor de la suma es de salida utilizando laprintf
función. La función se puede ampliar para agregar alcance para otras operaciones aritméticas también.fuente
fuente
use un shell incorporado
let
, es similar a(( expr ))
fuente: https://www.computerhope.com/unix/bash/let.htm
fuente