Как добавить арифметические переменные в скрипт

26

Я хочу накопить размер строки для ряда файлов, содержащихся в папке. Я написал следующий скрипт:

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

В конце скрипта я получаю 123 + 234 + 432 + ... а не результат арифметической операции сложения.

любопытный
источник

Ответы:

50

Ваш синтаксис арифметической оценки неверен. Используйте любого из следующих (первого является чрезвычайно портативным , но медленно, вторым является POSIX и портативным кроме Борна оболочки и более ранние версий Альмквистой оболочки, последние три требуют ksh, bashили zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Или вы можете просто пропустить весь forцикл и просто сделать:

wc -l folder/*

Или, если вы хотите только всего:

cat folder/* | wc -l

Или с zsh и его mult_iosопцией:

wc -l < folder/*
manatwork
источник
Нет необходимости во $внутренней части ((...)). a=$((a+num))уже хорошо.
Вейцзюнь Чжоу
если переменная не установлена ​​или имеет нулевое значение, это будет работать, если нет другого способа справиться с этим.
Бхарат
7

Вы также можете использовать этот код

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

И УБЕДИТЕСЬ, ЧТО ЕСТЬ ПРОБЕЛ НА ОБОИХ СТОРОНАХ + IN "$ a + $ num"

user1678213
источник
всегда используйте пробел с обеих сторон оператора при использовании команды expr для расчета.
user1678213
2

Вы можете сначала объявить тип переменной:

    declare -i a=0
    declare -i num=0
Dr_Hope
источник
1

Извините, предыдущая редакция была для другого поста. Вот лишь небольшая модификация оригинального скрипта:

пусть а = 0
пусть num = 0
для меня в папке / *
делать
        num = `cat $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
сделанный
эхо $ а
Лео
источник
1
Отклонено, поскольку ответ, кажется, не обращается к вопросу.
Time4Tea
Извините, ребята, сейчас исправлено
Лев
1

В ответе необходимо указать, в какой оболочке действует код. Например, в bourne Shell ( sh) допустимы только следующие инструкции:

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

в то время как другие возможности , перечисленные @manatwork могут быть действительными в Bourne снова оболочки ( bash)

loved.by.Jesus
источник
-1

я делаю это так

MY_VARIABLE=$((num1+num2))
Хатем Бадави
источник
3
Это ничего не добавляет к тому, что уже было сказано.
Кусалананда
1
это краткий ответ
Хатем Бадави