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.

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

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"


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

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

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)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.