Apa konsep bahasa pemrograman untuk tidak mengevaluasi ekspresi secara default di bash?

8

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.

Tim
sumber
siapa bilang bash adalah bahasa pemrograman? dan tidak, itu bukan karena evaluasi malas: ini ada dalam bahasa lain juga tanpa masalah string
Christophe
8
@Siapa yang bilang bash adalah bahasa pemrograman? Yah Wikipedia , Stack Overflow , reddit , wikibooks . Dan hanya itu yang bisa saya sebutkan sebelum bosan. Sama seperti Jawa, ada lebih banyak hal memakai nama bash daripada hanya bahasa. Tapi ya, ada bahasa pemrograman bash.
candied_orange

Jawaban:

15

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:

varname=value

tidak mencari variabel yang dipanggil value, tetapi menggunakan string valuesecara 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

echo "Hello ${name}!"

(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

amon
sumber
7

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:

typeset -i x
x=1
x=x+1
echo $x

Anda hanya perlu memberi tahu shell bahwa variabel adalah integer, bukan string. Hal yang sama berlaku jika Anda ingin variabel menjadi array.

Jerry Jeremiah
sumber
Apa yang Anda katakan itu benar dan bermanfaat, tetapi tidak menjawab pertanyaan yang sebenarnya, yaitu "apa konsep bahasa pemrograman [...]"?
Andres F.
0

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.

Jeremy
sumber