Bir komut dosyasına aritmetik değişkenler nasıl eklenir


26

Bir klasörde bulunan çok sayıda dosyanın satır boyutunu biriktirmek istiyorum. Aşağıdaki betiği yazdım:

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

Senaryonun sonunda elde edeceğim şey 123 + 234 + 432 + ... ve eklemenin aritmetik işleminden kaynaklanmıyor.

Yanıtlar:


50

Aritmetik değerlendirme sözdiziminiz yanlış. Aşağıdakilerden herhangi (ilk derece taşınabilir ama yavaş, ikinci POSIX ve Bourne kabuğuna dışında taşınabilir ve Almquist kabuğunun önceki sürümleri, son üç gerektiren olduğunu kullanın ksh, bashya da zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Veya sadece tüm fordöngüyü atlayabilir ve yapabilirsiniz:

wc -l folder/*

Veya yalnızca toplamı istiyorsanız:

cat folder/* | wc -l

Veya zsh ve mult_iosseçenekleriyle:

wc -l < folder/*

$İçeriye gerek yok ((...)). a=$((a+num))zaten iyi.
Weijun Zhou,

eğer bir değişken ayarlanmamışsa veya boş değere sahipse, bununla baş etmenin başka bir yolu yoksa, bu işe yarar mıydı?
Bharat,

7

bu kodu da kullanabilirsiniz

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

ve "$ a + $ num" ın + IN'LERİNDEN BÜYÜK BİR YER OLDUĞUNDAN EMİN OLUN


hesaplama için expr komutunu kullanırken her zaman operatörün her iki tarafında boşluk bırakın.
user1678213

2

Önce değişkenin türünü beyan edebilirsiniz:

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

1

Maalesef, önceki düzenleme farklı bir yayın içindi. Burada, orijinal komut dosyasında yalnızca küçük bir değişiklik:

a = 0 olsun
num = 0 olsun
i / klasöründe
yap
        num = `cat $ i | wc
        a = $ (eko $ a + $ num | bc)
tamam
yankı

1
Oy verildi, cevap soruya hitap etmiyor gibi görünüyor.
Time4Tea,

Üzgünüm çocuklar, şimdi düzeltildi
Leo

1

Cevap , kodun hangi kabukta geçerli olduğunu belirtmelidir . Örneğin bourne Shell'de ( sh) sadece aşağıdaki talimatlar geçerlidir:

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

@manatwork tarafından listelenen diğer olasılıklar Bourne geçerli olabilir ise tekrar (kabuk bash)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.