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.

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/*

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"


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

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

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)


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.