Tüm değişkenler bellekte bash içinde dize olarak saklanıyor mu?


14

Aşağıdaki değişkenleri oluşturduğumu varsayalım:

s=John
i=12345
f=3.14

Bu değişkenlerin tümü bellekte dize olarak saklanıyor veya bashbaşka veri türleri var mı?


1
Sadece ilgisiz, neden önemli? Dilin işlevselliğini etkilemediği sürece Swahili metni olarak saklandıklarında gerçekten daha az umursamadım (performansı etkilemek bir sorun olabilir, ancak bu önemliyse, cephaneliğinizden daha iyi araçlardır. bash).

2
@paxdiablo Farketmez, sadece merak ediyorum, çünkü bildiğim diğer tüm programlama / komut dosyası dilleri (örneğin: Java, C ++, JavaScript, PHP, vb.) her veri türü için benzersiz bir bellek temsiline sahiptir bu nedenle, tüm veri türleri için yalnızca bir bellek temsiline sahip bir komut dosyası dili görmek ilginçtir.
user268325

Yanıtlar:


16

Bash değişkenleri türsüzdür .

Diğer birçok programlama dilinden farklı olarak Bash, değişkenlerini "türe" göre ayırmaz. Temel olarak, Bash değişkenleri karakter dizeleridir, ancak bağlama bağlı olarak Bash, aritmetik işlemlere ve değişkenler üzerinde karşılaştırmalara izin verir. Belirleyici faktör, bir değişkenin değerinin sadece rakam içerip içermediğidir.

Başka bir yanıtın dediği gibi , yazmanın zayıf bir formu vardır declare.

Bu, belirli programlama dillerinde mevcut olan yazmanın çok zayıf bir şeklidir [1].

Bir örneğe bakın:

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.

Referanslar:


13

Bash aslında düz skaler değişkenlere, dizilere ve ilişkisel dizilere sahiptir. Ek olarak, skalerler declareyerleşik ile tamsayı olarak etiketlenebilir . Komut dosyası programcının / kabuk kullanıcısının bakış açısına göre, dize değişkenleri dize, tamsayı değişkenleri tamsayı ve dizileri türlerine göre hareket eder. Dahili uygulama çok alakalı değildir.


Ancak, verilerin gerçekte bellekte nasıl saklandığını bilmek istiyorsak, programın gerçekte ne yaptığını görmek için kaynak kodunu incelemeliyiz.

Bash 4.4'te, skaler, tamsayı etiketine bakılmaksızın dize olarak saklanır. Bu, / typedef tanımındastruct variableSHELL_VAR ve işlevdemake_variable_value tamsayıları saklamak üzere dizelere çeviren görünür .

Diziler, bağlantılı bir liste ( array.h) ve ilişkilendirilebilir dizileri karma tablolar olarak depolanır . İçlerindeki değerler yine dize olarak saklanır. Diziler için bağlantılı bir listenin seçimi tuhaf görünebilir, ancak diziler seyrek olabileceğinden ve dizinin ne kadar az öğe içerdiğinden bağımsız olarak dizinler rasgele sayılar olabilir, bu tasarım seçiminin anlaşılması biraz daha kolaydır.

Bununla birlikte, kod , tamsayı sayıları, kayan nokta sayıları ve dize değerleri alanlarıyla kullanılmayanunion _value için bir tanım içerir . Bir yorumda "gelecek için" olarak işaretlendi, bu nedenle Bash'in gelecekteki bazı sürümlerinin yerel formlarında farklı türlerde skaler depolaması mümkündür.


1

Hayatım boyunca bunun pek çok kelimede hiçbir yerde ifade edildiğini bulamıyorum ama bunu böyle anlıyorum.

Bash bir yorumlayıcıdır, derleyici değildir ve tüm değişkenleri dize olarak temsil eder. Bu nedenle, çeşitli türdeki açılımlarla birlikte giden tüm çaba ve vurgu.

Bash geçer geçer tüm adlandırılmış değişkenleri declareile dizeleri olarak niteliklerin o değişken olması için ne kadar kontrol o genişletilmiş tarafından declaredepolama.

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" )

Ve tabi ki

declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")

Bunun kodası declare, öznitelik bayraklarıyla değişen dahili bir temsili olsa bile , dizelerin bash'ın gördüğü veya görmek istediği tek şey olmasıdır.



0

İlgisiz.

Bash değişkenleriyle etkileşime girmenin tek yolu Bash'tır, bu nedenle değişkenlerin bellekte nasıl saklandığına dair herhangi bir fark fark etmeniz imkansızdır , çünkü bunlara hiçbir zaman doğrudan bellek üzerinden erişemezsiniz , her zaman Bash'i istemeniz gerekir. değer ve Bash o zaman ne isterse yolu onları çevirebilir bakmak onlar sanki sahada herhangi belirli bir şekilde saklanmış.

Aslında, onlar bile bellekte depolanabilir değil hiç . Bash'in ortak uygulamalarının ne kadar akıllı olduğunu bilmiyorum, ancak en azından basit durumlarda bir değişkenin kullanılıp kullanılmayacağını ve / veya değiştirilip değiştirilmeyeceğini belirlemek ve tamamen veya satır içi optimize etmek mümkündür.


Sorunun asıl noktası konumdan
bu5hman

2
Demek istediğim olmasıdır olamaz bunu gözlemlemek gelmediğinden dolayı temsilini biliyoruz. Yani, alakasızdır ve siz fark etmeden değişebilir. Bash'in hangi temsili seçebileceğini söylemek imkansız. Bir uygulamanın kaynak kodunu inceleyebilir ve hangi temsili seçtiğini kontrol edebilirsiniz, ancak bir sonraki yama sürümünde gösterimi yarın değiştirebilir ve bilmeniz mümkün olmaz.
Jörg W Mittag

Schroeding değişkenleri? Temel temsilin ilgisiz olduğu konusunda temel olarak hemfikirim (cevabıma bakın), ancak bash'ı kullanırken etkili bir şekilde 'bir arayüze kodlama' yapıyoruz ve arayüzdeki gösterim çok katı.
bu5hman

2
Evet, ancak soru arayüz sınırındaki temsil ile değil, özellikle "bellekte nasıl saklandıklarıyla" ilgilidir. Ve bu soruya cevap verirdim: bilmiyoruz, yapamıyoruz ve bilmemeliyiz.
Jörg W Mittag

Hangi kendi yazı son satırını ..... söylediğim gibi, biz katılıyorum ...... ve OP temsilcisi ve sorunun doğası göz önüne alındığında, onlar ödevleri için makul işaretleri verileceğini düşünüyorum, kim olursa olsun alıntılanır ;-).
bu5hman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.