Come aggiungere variabili aritmetiche in uno script


26

Voglio accumulare le dimensioni della linea di un numero di file contenuti in una cartella. Ho scritto il seguente script:

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

Quello che sto ottenendo alla fine dello script è 123 + 234 + 432 + ... e non il risultato dell'operazione aritmetica di addizione.

Risposte:


50

La sintassi della valutazione aritmetica è errata. Utilizzare una delle seguenti (il primo è estremamente portatile ma lento, il secondo è POSIX e portatile se non nella Bourne shell e le versioni precedenti del guscio Almquist, gli ultimi tre richiedono ksh, basho zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Oppure puoi semplicemente saltare l'intero forciclo e fare semplicemente:

wc -l folder/*

Oppure, se vuoi solo il totale:

cat folder/* | wc -l

O con zsh e la sua mult_iosopzione:

wc -l < folder/*

Non c'è bisogno per l' $interno ((...)). a=$((a+num))va già bene.
Weijun Zhou

se una variabile non è impostata o ha un valore nullo, funzionerebbe se non fosse possibile gestirla in altro modo.
Bharat,

7

puoi anche usare questo codice

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

e ASSICURARSI CHE SIA UNO SPAZIO SU ENTRAMBI I LATI DI + IN "$ a + $ num"


dare sempre spazio su entrambi i lati dell'operatore quando si utilizza il comando expr per il calcolo.
user1678213

2

Puoi prima dichiarare il tipo di variabile:

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

1

Spiacenti, la modifica precedente era per un altro post. Qui, solo una piccola modifica allo script originale:

lascia a = 0
lascia num = 0
per i nella cartella / *
fare
        num = `cat $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
fatto
echo $ a

1
Votato verso il basso, poiché la risposta non sembra rispondere alla domanda.
Time4Tea,

Scusate ragazzi, ora corretto
Leo

1

La risposta deve specificare in quale shell è valido il codice. Ad esempio nella bourne Shell ( sh) sono valide solo le seguenti istruzioni:

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

mentre le altre possibilità elencate da @manatwork potrebbero essere valide in bourne again shell ( bash)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.