Bagaimana cara menambahkan variabel aritmatika dalam skrip

26

Saya ingin mengakumulasi ukuran garis sejumlah file yang terkandung dalam folder. Saya telah menulis skrip berikut:

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

Apa yang saya dapatkan di akhir skrip adalah 123 + 234 + 432 + ... dan bukan hasil dari operasi aritmatika penambahan.

ingin tahu
sumber

Jawaban:

50

Sintaks evaluasi aritmatika Anda salah. Gunakan salah satu dari yang berikut ini (yang pertama sangat portabel tetapi lambat, yang kedua adalah POSIX dan portabel kecuali ke shell Bourne dan versi yang lebih lama dari shell Almquist, yang tiga membutuhkan ksh, bashatau zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Atau Anda bisa melewatkan seluruh forloop dan lakukan saja:

wc -l folder/*

Atau, jika Anda hanya menginginkan totalnya:

cat folder/* | wc -l

Atau dengan zsh dan mult_iosopsinya:

wc -l < folder/*
manatwork
sumber
Tidak perlu bagian $dalam ((...)). a=$((a+num))sudah baik.
Weijun Zhou
jika suatu variabel tidak disetel atau memiliki nilai nol, apakah ini akan berfungsi, jika tidak ada cara lain untuk mengatasinya.
Bharat
7

Anda juga dapat menggunakan kode ini

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

dan PASTIKAN BAHWA ADA RUANG PADA KEDUA SISI + DALAM "$ a + $ num"

pengguna1678213
sumber
selalu memberi ruang pada kedua sisi operator saat menggunakan perintah expr untuk perhitungan.
user1678213
2

Anda bisa mendeklarasikan jenis variabel terlebih dahulu:

    declare -i a=0
    declare -i num=0
Dr_Hope
sumber
1

Maaf, hasil edit sebelumnya adalah untuk pos yang berbeda. Di sini, hanya sedikit modifikasi pada skrip asli:

biarkan a = 0
biarkan num = 0
untuk saya di folder / *
melakukan
        num = `cat $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
selesai
gema $ a
Leo
sumber
1
Dipilih, karena jawabannya tidak muncul untuk menjawab pertanyaan.
Time4Tea
Maaf teman-teman, sekarang dikoreksi
Leo
1

Jawabannya perlu menentukan di mana shell kode itu valid. Misalnya dalam bourne Shell ( sh) hanya instruksi berikut ini yang valid:

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

sedangkan kemungkinan lain yang terdaftar oleh @manatwork mungkin valid di bourne lagi shell ( bash)

dicintai.Yesus
sumber
-1

saya membuatnya seperti ini

MY_VARIABLE=$((num1+num2))
Hatem Badawi
sumber
3
Ini tidak menambah apa pun yang telah dikatakan.
Kusalananda
1
itu adalah jawaban singkatnya
Hatem Badawi