Mencoba bash arithemetic untuk skrip, tetapi $e
tidak memperbarui hingga akhir. Outputnya berbicara sendiri.
max=5
for e in $(seq 1 1 $max); do
percent=$(( $e/$max*100 ))
echo "echo $e / $max : = $percent"
done
Tl; DR: Tampilkan 1..5 sebagai persentase.
Keluaran:
echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100
Kenapa ini?
command-line
bash
scripts
Cybex
sumber
sumber
Jawaban:
bash
tidak dapat menangani aritmatika non-integer. Ini akan memberi Anda hasil yang benar selama semua ekspresi adalah bilangan bulat. Jadi, Anda perlu menghindari mendapatkan nilai non-integer di suatu tempat dalam perhitungan Anda.Dalam kasus Anda, ketika Anda mengevaluasi
1 / 5
,2 / 5
dll. Itu menciptakan nilai nol integer dalam bash korespondensi dengan beberapa nilai non-integer dan hasilnya keluar menjadi nol sesuai. Precedence of division dan multiplication adalah operator yang sama dan preseden yang sama selalu dieksekusi dari kiri ke kanan karena mereka ditempatkan dalam ekspresi.Salah satu penyelesaiannya adalah melakukan perkalian terlebih dahulu dan kemudian pembagian sehingga bash tidak harus menangani nilai non-integer. Ekspresi yang dikoreksi adalah,
sumber
1/5
tidak membuat nilai non-integer . Ini menciptakan nilai integer0
, karena hasil pembagian integer dari 1 oleh 5 adalah 0. Operasi lebih lanjut berhasil menggunakan nilai dari0
. Ini bukan yang dimaksudkan OP, tetapi tidak ada operasi yang menciptakan nilai non-integer dan tidak ada operasi yang gagal.Bash tidak terlalu baik di aritmatika semacam ini ... Ini masalah Anda:
Jika Anda perlu menangani nilai-nilai non-integer, Anda bisa menggunakan
bc
(terima kasih kepada @Arronical untuk menunjukkan cara memformat output sebagai integer)
sumber
.0
dari output dengan mengubah$percent
gema Anda menjadi${percent%.*}
:)Tidak seperti bash, awk menawarkan aritmatika floating point penuh. Sebagai contoh:
sumber
Mencoba
:)
Lihat bagian EVALUASI ARITHMETIK dari:
Ini hanya mendukung integer.
sumber