Saya telah mencoba untuk meningkatkan variabel numerik menggunakan keduanya var=$var+1
dan var=($var+1)
tidak berhasil. Variabelnya adalah angka, meskipun bash tampaknya membacanya sebagai string.
Bash versi 4.2.45 (1) -release (x86_64-pc-linux-gnu) di Ubuntu 13.10.
((++var))
atau((var=var+1))
atau((var+=1))
.var=0; ((var++))
mengembalikan kode kesalahan sementaravar=0; ((var++)); ((var++))
tidak. Ada yang tahu kenapa?help '(('
. Baris terakhir berbunyi:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
mengapa tip @ gniourf_gniourf termasuk((++var))
tetapi tidak((var++))
.let var++
, tanpa tanda kutip?Aritmatika dalam bash menggunakan
$((...))
sintaks.sumber
((...))
itulah kunci untuk menggunakan aritmatika di bash. Saya tidak menyadari bahwa hanya dengan melihat jawaban yang diterima - saya pikir ada seperangkat aturan aneh tentang urutan operasi atau sesuatu yang mengarah ke semua tanda kurung dalam jawaban yang diterima.Analisis Kinerja dari berbagai opsi
Berkat jawaban Radu Rădeanu yang menyediakan cara-cara berikut untuk meningkatkan variabel dalam bash:
Ada beberapa cara lain juga. Misalnya, lihat jawaban lain untuk pertanyaan ini.
Memiliki begitu banyak opsi mengarah pada dua pertanyaan ini:
Kode uji kinerja tambahan:
Hasil:
Kesimpulan:
Tampaknya bash lebih cepat dalam performanya
i+=1
ketika$i
dinyatakan sebagai integer.let
pernyataan tampaknya sangat lambat, danexpr
sejauh ini paling lambat karena bukan builtin.sumber
Ada juga ini:
Perhatikan spasi dan juga ' tidak '
Sementara jawaban Radu, dan komentarnya, lengkap dan sangat membantu, mereka spesifik bash. Saya tahu Anda secara khusus bertanya tentang bash, tapi saya pikir saya akan menjawab karena saya menemukan pertanyaan ini ketika saya mencari untuk melakukan hal yang sama menggunakan sh di busybox di bawah uCLinux. Portable ini melampaui bash.
sumber
i=$((i+1))
$(...)
tersedia pada shell ini, saya akan merekomendasikan menggunakannya sebagai gantinya.Jika Anda menyatakan
$var
sebagai bilangan bulat, maka apa yang Anda coba pertama kali sebenarnya akan berfungsi:Referensi: Jenis variabel, Bash Guide for Beginners
sumber
Ada satu metode yang hilang dalam semua jawaban -
bc
bc
ditentukan oleh standar POSIX , jadi harus ada pada semua versi Ubuntu dan sistem yang mendukung POSIX . The<<<
redirection dapat diubah untukecho "$VAR" | bc
untuk portabilitas, tapi karena pertanyaan bertanya tentangbash
- itu OK untuk hanya menggunakan<<<
.sumber
Kode kembali
1
masalah hadir untuk semua varian default (let
,(())
, dll). Ini sering menyebabkan masalah, misalnya, dalam skrip yang digunakanset -o errexit
. Inilah yang saya gunakan untuk mencegah kode kesalahan1
dari ekspresi matematika yang mengevaluasi0
;sumber
Ini harus menjadi cara terburuk untuk menyelesaikan tugas semudah itu, tetapi saya hanya ingin mendokumentasikannya untuk bersenang-senang (kira-kira berlawanan dengan kode golf).
atau
Serius gunakan salah satu pilihan lain yang jauh lebih baik di sini.
sumber