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


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

Нет необходимости во $внутренней части ((...)). a=$((a+num))уже хорошо.
Вейцзюнь Чжоу

если переменная не установлена ​​или имеет нулевое значение, это будет работать, если нет другого способа справиться с этим.
Бхарат

7

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

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

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


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

2

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

    declare -i a=0
    declare -i num=0

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)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.