Di Bash, untuk meningkatkan nilai integer yang disimpan dalam variabel, kita perlu secara eksplisit menggunakan ekspansi aritmatika.
i=1
i=$((i+1))
Jika tidak
i=1
i=i+1
tidak akan mengevaluasi ekspresi i+1
, tetapi menetapkan ekspresi sebagai string ke variabel.
Ini sangat tidak alami dibandingkan dengan bahasa pemrograman lain, di mana ekspresi dievaluasi secara default.
Dalam desain atau konsep bahasa pemrograman, apakah ada konsep atau terminologi untuk fitur seperti itu di bash?
Apa gunanya tidak mengevaluasi ekspresi tetapi memperlakukannya sebagai string secara default?
Apakah fitur ini terkait dengan waktu evaluasi, seperti evaluasi malas?
Terima kasih.
Jawaban:
Tidak ada konsep khusus di sini. Sebaliknya, semua yang ada di shell adalah string literal, kecuali jika Anda secara eksplisit menggunakan ekspansi. Keputusan desain ini memudahkan untuk menetapkan, nah, nilai-nilai literal, yang merupakan kasus penggunaan utama dari penugasan:
tidak mencari variabel yang dipanggil
value
, tetapi menggunakan stringvalue
secara harfiah. Dalam bash, sebagian besar karakter "spesial" seperti+ - /
dll. Tidak spesial dengan cara apa pun - mereka hanya bagian dari kata-kata literal seperti karakter alfabet.Sintaksis ekspansi memungkinkan kita untuk dengan mudah menanamkan nilai di dalam templat, mis
(Perhatikan bahwa dalam shell, tanda kutip suka
'…'
atau"…"
tidak membatasi string, sebaliknya mereka mengubah ekspansi mana yang diterapkan - tanda kutip tunggal menekan semua ekspansi dan pemisahan kata, tanda kutip ganda menekan pemisahan kata dan ekspansi glob tetapi bukan ekspansi variabel, ekspansi aritmatika (hanya Bash) ., atau perintah substitusi kata-kata berikut adalah sama:foo\ bar
,foo' 'bar
,'foo bar'
).Konsekuensi dari pendekatan "semuanya adalah string secara default" adalah bahwa program yang tidak hanya menggunakan string sederhana menjadi lebih rumit. Sintaks array Bash terkenal membingungkan. Ekspansi aritmatika agak tidak jelas. Namun, program semacam itu bukan yang paling cocok untuk skrip shell.
Bacaan yang disarankan: Deskripsi POSIX tentang sintaks dan semantik shell: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
sumber
Anda BISA membuatnya bekerja seperti itu jika Anda mau. Semua yang ada di shell adalah string literal, kecuali jika Anda secara eksplisit mengatakannya sebagai sesuatu yang lain. Misalnya, yang berikut ini mencetak 2:
Anda hanya perlu memberi tahu shell bahwa variabel adalah integer, bukan string. Hal yang sama berlaku jika Anda ingin variabel menjadi array.
sumber
Ini adalah
aturan untuk bahasa itu.
Untuk bash aturannya adalah teks itu literal kecuali Anda menggunakan
"#{name}"
formatnya.Lihat juga https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
sumber
Konsep di sini adalah "kompatibilitas ke belakang". Shell Bourne memperlakukan semuanya sebagai string sehingga bash harus juga secara default atau semua skrip pra-bash akan rusak.
sumber