Saya punya skrip Bash ini dan saya punya masalah di baris 16. Bagaimana saya bisa mengambil hasil sebelumnya dari baris 15 dan menambahkannya ke variabel di baris 16?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Jawaban:
Untuk bilangan bulat :
Gunakan ekspansi aritmatika :
$((EXPR))
Menggunakan
expr
utilitas eksternal . Perhatikan bahwa ini hanya diperlukan untuk sistem yang benar-benar lama.Untuk floating point :
Bash tidak secara langsung mendukung ini, tetapi ada beberapa alat eksternal yang dapat Anda gunakan:
Anda juga dapat menggunakan notasi ilmiah (misalnya,
2.5e+2
).Perangkap umum :
Saat mengatur variabel, Anda tidak dapat memiliki spasi putih di kedua sisi
=
, jika tidak maka akan memaksa shell untuk menafsirkan kata pertama sebagai nama aplikasi yang akan dijalankan (misalnya,num=
ataunum
)num= 1
num =2
bc
danexpr
mengharapkan setiap angka dan operator sebagai argumen terpisah, jadi spasi putih itu penting. Mereka tidak dapat memproses argumen seperti3+
+4
.num=`expr $num1+ $num2`
sumber
num1
dannum2
ada dan memiliki nilai integer?$((..))
evaluasi aritmatika dijalankan dalam bash.expr
dieksekusi sebagai proses terpisah, jadi itu akan jauh lebih lambat. gunakan yang terakhir pada sistem di mana evaluasi arithemtic tidak didukung (sh! = bash)$((…))
sudah distandarisasi oleh POSIX, itu harus menjadi semakin langka yangexpr
diperlukan.Gunakan
$(( ))
ekspansi aritmatika.Lihat Bab 13. Perluasan Aritmatika untuk informasi lebih lanjut.
sumber
191.003 + 190
.Ada seribu satu cara untuk melakukannya. Inilah yang menggunakan
dc
(kalkulator meja reverse-polish yang mendukung aritmatika presisi tak terbatas):Tetapi jika itu terlalu bash-y untuk Anda (atau masalah portabilitas) Anda bisa mengatakannya
Tapi mungkin Anda salah satu dari orang-orang yang berpikir RPN itu menjijikkan dan aneh; jangan khawatir!
bc
ada di sini untuk Anda:Karena itu, ada beberapa peningkatan yang tidak terkait yang bisa Anda lakukan pada skrip Anda:
Seperti yang dijelaskan dalam Bash FAQ 022 , Bash tidak secara asli mendukung angka floating point. Jika Anda perlu menjumlahkan angka floating point diperlukan penggunaan alat eksternal (suka
bc
ataudc
).Dalam hal ini solusinya adalah
Untuk menambahkan akumulasi angka-angka yang mungkin mengambang ke
num
.sumber
Di bash,
Perhatikan bahwa bash hanya dapat menangani bilangan bulat aritmatika, jadi jika perintah awk Anda mengembalikan sebagian, maka Anda ingin mendesain ulang: inilah kode Anda yang ditulis ulang sedikit untuk mengerjakan semua matematika dalam awk.
sumber
Saya selalu lupa sintaksnya jadi saya datang ke google, tetapi kemudian saya tidak pernah menemukan yang saya kenal: P. Ini adalah yang terbersih bagi saya dan lebih sesuai dengan apa yang saya harapkan dalam bahasa lain.
sumber
sumber
Saya sangat suka metode ini juga, kurang berantakan:
sumber
Anda harus mendeklarasikan metab sebagai integer dan kemudian menggunakan evaluasi aritmatika
Untuk informasi lebih lanjut, lihat https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
sumber
Cara lain yang
POSIX
sesuai portabel untuk dilakukanbash
, yang dapat didefinisikan sebagai fungsi.bashrc
untuk semua operator aritmatika kenyamanan.dan sebut saja di baris perintah sebagai,
Idenya adalah menggunakan Input-Field-Separator (IFS) , variabel khusus yang
bash
digunakan untuk pemisahan kata setelah ekspansi dan untuk memecah baris menjadi kata-kata. Fungsi ini mengubah nilai secara lokal untuk menggunakan karakter pemisah kata sebagai operator penjumlahan+
.Ingat
IFS
ini diubah secara lokal dan TIDAK berpengaruh padaIFS
perilaku default di luar lingkup fungsi. Kutipan dariman bash
halaman,The
"$(( $* ))"
mewakili daftar argumen dilewatkan menjadi terbelah oleh+
dan kemudian nilai sum adalah output menggunakanprintf
fungsi. Fungsi ini dapat diperluas untuk menambah ruang lingkup untuk operasi aritmatika lainnya juga.sumber
sumber
menggunakan shell built-in
let
, ini mirip dengan(( expr ))
sumber: https://www.computerhope.com/unix/bash/let.htm
sumber