Saya ingin tahu apa perbedaan sebenarnya
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Semua 4 menetapkan variabel a dengan 2, tetapi apa bedanya?
Dari apa yang saya temukan sejauh ini, adalah bahwa expr lebih lambat karena itu bukan shell builtin yang sebenarnya. Tapi tidak lebih dari itu.
((...))
sebenarnya dapat digunakan untuk penugasanbash
,ksh
danzsh
:n=10; ((n+=10)); echo $n
mencetak 20 dan((x=1)); echo $x
mencetak 1.let
perintah melakukan evaluasi aritmatika dan shell built-in.Jalankan perintah ini dan Anda tidak mendapatkan apa-apa (hanya mengevaluasi):
$(( ))
digunakan untuk melakukan ekspansi aritmatika : baca di siniJalankan yang ini dan Anda akan mendapatkan kesalahan (karena ekspansi):
$[ ]
adalah sintaks lama untuk ekspansi aritmatika:expr
adalah perintah biner, jika Anda ingin melakukan ekspansi aritmatika dalam subsituasi perintah, Anda dapat menggunakannya:sumber
Karena beberapa jawaban di atas secara khusus menyebutkan
ksh93
perlu dicatat bahwa ia dapat melakukan matematika titik mengambang, misalnya:Anda dapat mengontrol ketepatan output dengan printf, misalnya:
Setidaknya satu argumen harus ditentukan sebagai angka titik-mengambang seperti di atas. Jika keduanya ditentukan sebagai bilangan bulat maka hanya matematika bilangan bulat yang dilakukan, misalnya:
Ini bisa membantu ketika Anda membutuhkan matematika floating point dalam skrip shell karena Anda dapat menghindari memanggil perintah eksternal.
sumber
zsh
jawaban . Karenaksh
danbash
lebih mirip satu sama lain (secara umum) daripada keduanyazsh
, menurut sayakh93
jawaban berbasis pertanyaan itu bisa sangat berguna.let
tidak bekerja di cron. Saya pikir itu karenalet
memiliki lingkungannya sendiri. Gunakan$((...))
karena itu POSIX. Sebagai contoh,di cron, menghasilkan "x =", tetapi "x = 3" saat dijalankan dari shell.
menghasilkan "x = 3" dalam semua kasus.
sumber