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.

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

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”


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

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

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)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.