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ı?
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ı?
Yanıtlar:
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:
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.
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.
Bu sayfada Bash'e değişken yazma konusunda kapsamlı bir kılavuz bulunmaktadır. Bu bölümdeclare yerleşik komut hakkında daha fazla bilgi içerir . Bu bağlantıdan bu kod snippet'i ilgi çekici olabilir:
[bob in ~] declare -i VARIABLE=12
[bob in ~] VARIABLE=string
[bob in ~] echo $VARIABLE
0
[bob in ~] declare -p VARIABLE
declare -i VARIABLE="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.
bash).