Як додати арифметичні змінні в сценарій


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

На жаль, попередня редакція була для іншого допису. Ось лише невелика модифікація оригінального сценарію:

нехай a = 0
нехай num = 0
для я в папці / *
робити
        num = `cat $ i | wc -l`
        a = $ (відлуння $ a + $ num | bc)
зроблено
відлуння $ a

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.