Cómo agregar variables aritméticas en un script

26

Quiero acumular el tamaño de línea de varios archivos contenidos en una carpeta. He escrito el siguiente script:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

Lo que obtengo al final del script es 123 + 234 + 432 + ... y no el resultado de la operación aritmética de la suma.

curioso
fuente

Respuestas:

50

Su sintaxis de evaluación aritmética es incorrecta. Utilice cualquiera de los siguientes (el primero es extremadamente portátil pero lento, el segundo es POSIX y portátil excepto para el shell Bourne y versiones anteriores del shell Almquist, los últimos tres requieren ksh, basho zsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

O simplemente puede omitir todo el forciclo y simplemente hacer:

wc -l folder/*

O, si solo quieres el total:

cat folder/* | wc -l

O con zsh y su mult_iosopción:

wc -l < folder/*
hombre trabajando
fuente
No es necesario el $interior ((...)). a=$((a+num))Ya está bien.
Weijun Zhou
si una variable no está establecida o tiene un valor nulo, ¿funcionaría esto? Si no hay otra forma de manejar eso.
Bharat
7

también puedes usar este código

    a=`expr $a + $num`
    echo $a

y ASEGÚRESE DE QUE HAY UN ESPACIO EN AMBOS LADOS DE + EN "$ a + $ num"

usuario1678213
fuente
siempre dé espacio a ambos lados del operador cuando use el comando expr para el cálculo.
user1678213
2

Primero puede declarar el tipo de variable:

    declare -i a=0
    declare -i num=0
Dr_Hope
fuente
1

Lo sentimos, la edición anterior fue para una publicación diferente. Aquí, solo una pequeña modificación al script original:

dejar a = 0
dejar num = 0
para i en la carpeta / *
hacer
        num = `gato $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
hecho
echo $ a
León
fuente
1
Votado, ya que la respuesta no parece abordar la pregunta.
Time4Tea
Lo siento chicos, ahora corregido
Leo
1

La respuesta debe especificar en qué shell es válido el código. Por ejemplo, en el bourne Shell ( sh) solo son válidas las siguientes instrucciones:

a=$((a+num))
a=$(($a+$num))

mientras que las otras posibilidades enumeradas por @manatwork pueden ser válidas en bourne nuevamente shell ( bash)

amado por Jesús
fuente
-1

lo hago asi

MY_VARIABLE=$((num1+num2))
Hatem Badawi
fuente
3
Esto no agrega nada a lo que ya se ha dicho.
Kusalananda
1
es la respuesta breve
Hatem Badawi