Katakanlah saya membuat variabel berikut:
s=John
i=12345
f=3.14
Apakah semua variabel ini disimpan dalam memori sebagai string, atau memang bash
memiliki tipe data lain?
Katakanlah saya membuat variabel berikut:
s=John
i=12345
f=3.14
Apakah semua variabel ini disimpan dalam memori sebagai string, atau memang bash
memiliki tipe data lain?
Jawaban:
Variabel Bash tidak diketik .
Tidak seperti banyak bahasa pemrograman lain, Bash tidak memisahkan variabel-variabelnya dengan "ketik". Pada dasarnya, variabel Bash adalah string karakter, tetapi, tergantung pada konteksnya, Bash mengizinkan operasi aritmatika dan perbandingan pada variabel. Faktor penentu adalah apakah nilai suatu variabel hanya berisi angka.
Seperti jawaban lain mengatakan , ada semacam bentuk pengetikan yang lemahdeclare
.
Ini adalah bentuk pengetikan [1] yang sangat lemah yang tersedia dalam bahasa pemrograman tertentu.
Lihat sebuah contoh:
declare -i number # The script will treat subsequent occurrences of "number" as an integer. number=3 echo "Number = $number" # Number = 3 number=three echo "Number = $number" # Number = 0 # Tries to evaluate the string "three" as an integer.
Referensi:
Bash pada dasarnya memiliki variabel skalar polos, array, dan array asosiatif. Selain itu, skalar dapat ditandai sebagai bilangan bulat dengan declare
builtin . Dari sudut pandang programmer script / pengguna shell, variabel string bertindak sebagai string, variabel integer bertindak sebagai integer, dan array sesuai dengan tipenya. Implementasi internal tidak terlalu relevan.
Tetapi, jika kita ingin tahu bagaimana data sebenarnya disimpan dalam memori, kita harus memeriksa kode sumber untuk melihat apa yang sebenarnya dilakukan oleh program.
Di Bash 4.4, skalar disimpan sebagai string, terlepas dari tag integer. Ini terlihat dalam definisi struct variable
/ the SHELL_VAR
typedef dan dalam fungsimake_variable_value
, yang secara eksplisit menerjemahkan bilangan bulat ke string untuk penyimpanan.
Array disimpan dalam apa yang tampak sebagai daftar tertaut ( array.h
), dan array asosiatif sebagai tabel hash. Nilai-nilai di dalamnya disimpan lagi sebagai string. Pilihan daftar yang ditautkan untuk array mungkin tampak aneh, tetapi karena array dapat jarang, dan indeks dapat berupa angka arbitrer terlepas dari seberapa sedikit elemen yang terdapat dalam array, pilihan desain sedikit lebih mudah untuk dipahami.
Namun, kode juga berisi definisi untuk yang tidak digunakanunion _value
, dengan bidang untuk angka integer, angka floating point, serta nilai string. Itu ditandai dalam komentar sebagai "untuk masa depan", jadi ada kemungkinan bahwa beberapa versi Bash di masa depan akan menyimpan berbagai jenis skalar dalam bentuk asli mereka.
Untuk kehidupan saya, saya tidak dapat menemukan ini dinyatakan di mana saja dalam banyak kata tetapi ini adalah bagaimana saya memahaminya.
Bash adalah interpreter, bukan kompiler dan mewakili semua variabel sebagai string. Oleh karena itu semua upaya dan penekanan yang berjalan dengan ekspansi dari berbagai jenis.
Bash melewati meneruskan semua variabel bernama ke declare
sebagai string dengan atribut yang mengontrol bagaimana variabel itu akan diperluas oleh declare
pada penyimpanan.
banana=yellow #no call to declare
declare -p banana
declare -- banana="yellow" #but declare was invoked with --
declare -i test=a #arithmetic expansion to null/zero
declare -p test
declare -i test="0"
declare -i test2=5+4 #successful arithmetic expansion
declare -p test2
declare -i test2="9"
declare -i float=99.6 #arithmetical expansion fails due to syntax
bash: declare: 99.6: syntax error: invalid arithmetic operator (error token is ".6")
nofloat=99.9
declare -p nofloat
declare -- nofloat"99.6" #Success because arithmetical expansion not invoked
declare -a a #variable is marked as a placeholder to receive an array
declare -p a
declare -a a
a[3]=99 #array elements are appended
a[4]=99
declare -p a
declare -a a=([3]="99" [4]="99")
declare -A newmap #same as -a but names instead of numbers
newmap[name]="A Bloke"
newmap[designation]=CFO
newmap[company]="My Company"
declare -p newmap
declare -A newmap=([company]="My Company" [name]="A Bloke" [designation]="CFO" )
Dan tentu saja
declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")
Coda untuk ini adalah bahwa bahkan jika declare
memiliki representasi internal yang berubah dengan flag atribut, string adalah semua yang dilihat atau ingin dilihat oleh bash.
Halaman ini memiliki panduan komprehensif tentang mengetik variabel di Bash. Bagian ini memiliki informasi lebih lanjut tentang declare
perintah bawaan. Cuplikan kode ini dari tautan itu mungkin menarik:
[bob in ~] declare -i VARIABLE=12
[bob in ~] VARIABLE=string
[bob in ~] echo $VARIABLE
0
[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"
Itu tidak relevan.
Satu-satunya cara untuk berinteraksi dengan variabel Bash adalah melalui Bash, jadi tidak mungkin bagi Anda untuk melihat perbedaan bagaimana variabel disimpan dalam memori, karena Anda tidak pernah dapat mengaksesnya melalui memori secara langsung , Anda selalu perlu meminta Bash untuk nilai, dan Bash kemudian dapat menerjemahkannya dengan cara apa pun yang ingin terlihat seolah-olah mereka telah disimpan dengan cara tertentu.
Bahkan, mereka bahkan mungkin tidak disimpan dalam memori sama sekali . Saya tidak tahu seberapa pintar implementasi umum Bash, tetapi setidaknya mungkin dalam kasus-kasus sederhana untuk menentukan apakah suatu variabel akan digunakan dan / atau apakah itu akan dimodifikasi, dan mengoptimalkannya sepenuhnya atau inline itu.
bash
).