Jak dodać zmienne arytmetyczne do skryptu

26

Chcę kumulować rozmiar linii wielu plików zawartych w folderze. Napisałem następujący skrypt:

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

To, co otrzymuję na końcu skryptu, to 123 + 234 + 432 + ... a nie wynik operacji arytmetycznej dodawania.

ciekawy
źródło

Odpowiedzi:

50

Twoja składnia oceny arytmetycznej jest nieprawidłowa. Użyj dowolnej z poniższych (pierwszy jest bardzo przenośny, ale powolna, drugi POSIX i przenośne z wyjątkiem Bourne shell i wcześniejsze wersje Almquist skorupek trzy ostatnie wymagają ksh, bashlub zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Lub możesz po prostu pominąć całą forpętlę i po prostu zrobić:

wc -l folder/*

Lub jeśli chcesz tylko całość:

cat folder/* | wc -l

Lub z zsh i jego mult_iosopcją:

wc -l < folder/*
człowiek w pracy
źródło
Nie ma potrzeby $wnętrza ((...)). a=$((a+num))jest już w porządku.
Weijun Zhou,
jeśli zmienna nie jest ustawiona lub ma wartość zerową, czy to zadziała, jeśli nie ma innego sposobu, aby sobie z tym poradzić.
Bharat
7

możesz również użyć tego kodu

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

i UPEWNIJ SIĘ, ŻE JEST PRZESTRZEŃ NA OBU STRONACH + W „$ a + $ num”

użytkownik1678213
źródło
zawsze używaj miejsca po obu stronach operatora, gdy używasz polecenia expr do obliczeń.
user1678213,
2

Możesz najpierw zadeklarować typ zmiennej:

    declare -i a=0
    declare -i num=0
Dr_Hope
źródło
1

Przepraszamy, poprzednia edycja dotyczyła innego wpisu. Oto tylko niewielka modyfikacja oryginalnego skryptu:

niech a = 0
niech num = 0
dla i w folderze / *
robić
        num = `cat $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
gotowy
echo $ a
Lew
źródło
1
Głosowałem w dół, ponieważ odpowiedź nie wydaje się odpowiadać na pytanie.
Time4Tea 30.01.2018
Przepraszam chłopaki, teraz poprawione
Leo
1

Odpowiedź musi określać, w której powłoce kod jest poprawny. Na przykład w bourne Shell ( sh) obowiązują tylko następujące instrukcje:

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

podczas gdy inne możliwości wymienione przez @manatwork mogą być ważne w bourne ponownie shell ( bash)

Lov.by.Jezus
źródło
-1

tak to robię

MY_VARIABLE=$((num1+num2))
Hatem Badawi
źródło
3
To nic nie dodaje do tego, co zostało już powiedziane.
Kusalananda
1
to krótka odpowiedź
Hatem Badawi