ว่าฉันสร้างตัวแปรต่อไปนี้:
s=John
i=12345
f=3.14
ตัวแปรเหล่านี้ทั้งหมดถูกจัดเก็บในหน่วยความจำเป็นสตริงหรือbashมีชนิดข้อมูลอื่นหรือไม่?
ว่าฉันสร้างตัวแปรต่อไปนี้:
s=John
i=12345
f=3.14
ตัวแปรเหล่านี้ทั้งหมดถูกจัดเก็บในหน่วยความจำเป็นสตริงหรือbashมีชนิดข้อมูลอื่นหรือไม่?
คำตอบ:
ตัวแปร Bash ถูกยกเลิกการพิมพ์
ซึ่งแตกต่างจากภาษาการเขียนโปรแกรมอื่น ๆ อีกมากมาย Bash ไม่ได้แยกตัวแปรตาม "type" โดยพื้นฐานแล้วตัวแปร Bash คือสตริงอักขระ แต่ขึ้นอยู่กับบริบท Bash อนุญาตให้มีการดำเนินการทางคณิตศาสตร์และการเปรียบเทียบกับตัวแปร ปัจจัยที่กำหนดคือว่าค่าของตัวแปรมีตัวเลขเท่านั้น
ในฐานะที่เป็นคำตอบอื่นบอกว่ามีเป็นชนิดของรูปแบบที่อ่อนแอdeclareของการพิมพ์ด้วย
นี่เป็นรูปแบบที่อ่อนมากของการพิมพ์ [1] ที่มีในภาษาการเขียนโปรแกรมบางอย่าง
ดูตัวอย่าง:
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.
อ้างอิง:
Bash เป็นหลักมีตัวแปรสเกลาร์ธรรมดา, อาร์เรย์, และอาเรย์แบบเชื่อมโยง นอกจากนี้สเกลาสามารถติดแท็กเป็นจำนวนเต็มด้วยในตัวdeclare จากมุมมองของผู้ใช้ / โปรแกรมเมอร์ของเชลล์สคริปต์ตัวแปรสตริงทำหน้าที่เป็นสตริงตัวแปรจำนวนเต็มทำหน้าที่เป็นจำนวนเต็มและอาร์เรย์ตามประเภทของพวกเขา การดำเนินการภายในไม่เกี่ยวข้องมาก
แต่ถ้าเราต้องการทราบวิธีการจัดเก็บข้อมูลจริงในหน่วยความจำเราต้องตรวจสอบซอร์สโค้ดเพื่อดูว่าโปรแกรมทำอะไร
ใน Bash 4.4 สเกลาร์จะถูกเก็บเป็นสตริงโดยไม่คำนึงถึงแท็กจำนวนเต็ม สิ่งนี้สามารถมองเห็นได้ในคำจำกัดความของstruct variable/ the SHELL_VARtypedefและในฟังก์ชันmake_variable_valueซึ่งแปลจำนวนเต็มเป็นสตริงสำหรับการจัดเก็บอย่างชัดเจน
อาร์เรย์ถูกเก็บไว้ในสิ่งที่ดูเหมือนว่าจะเป็นรายการที่เชื่อมโยง ( array.h) และเชื่อมโยงอาร์เรย์เป็นตารางแฮช ค่าภายในจะถูกเก็บไว้เป็นสตริงอีกครั้ง ตัวเลือกของรายการที่เชื่อมโยงสำหรับอาร์เรย์อาจดูแปลก แต่เมื่ออาร์เรย์สามารถกระจัดกระจายและดัชนีสามารถเป็นตัวเลขโดยไม่คำนึงว่าองค์ประกอบมีกี่อาร์เรย์ที่มีอยู่ตัวเลือกการออกแบบนั้นง่ายกว่าที่จะเข้าใจ
อย่างไรก็ตามรหัสดังกล่าวยังมีคำจำกัดความสำหรับส่วนที่ไม่ได้ใช้union _valueโดยมีเขตข้อมูลสำหรับตัวเลขจำนวนเต็มหมายเลขจุดลอยตัวและค่าสตริง มันถูกทำเครื่องหมายไว้ในความคิดเห็นว่า "สำหรับอนาคต" ดังนั้นจึงเป็นไปได้ว่า Bash รุ่นอนาคตจะเก็บสเกลาร์ประเภทต่าง ๆ ไว้ในรูปแบบดั้งเดิม
สำหรับชีวิตของฉันฉันไม่สามารถค้นหาสิ่งนี้ได้ที่ใดก็ได้ในหลาย ๆ คำ แต่นี่คือสิ่งที่ฉันเข้าใจ
Bash เป็นล่ามไม่ใช่คอมไพเลอร์และแสดงถึงตัวแปรทั้งหมดเป็นสตริง ดังนั้นความพยายามและความสำคัญทั้งหมดที่เกิดขึ้นกับการขยายตัวของรูปแบบต่างๆ
Bash pass ส่งผ่านตัวแปรที่มีชื่อทั้งหมดไปdeclareเป็นสตริงที่มีแอตทริบิวต์ที่ควบคุมวิธีการที่จะขยายตัวแปรโดยdeclareในหน่วยเก็บข้อมูล
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" )
และแน่นอนว่า
declare -ia finale[1]=9+16
declare -p finale
declare -ai finale=([1]="25")
ตอนจบของเรื่องนี้คือแม้ว่าจะdeclareมีการเป็นตัวแทนภายในที่เปลี่ยนแปลงด้วยแฟล็กแอ็ตทริบิวต์สตริงเป็นสิ่งที่ทุบตีเห็นหรือต้องการที่จะเห็น
หน้านี้มีคำแนะนำที่ครอบคลุมเกี่ยวกับการพิมพ์ตัวแปรใน Bash ส่วนนี้มีข้อมูลเพิ่มเติมเกี่ยวกับdeclareคำสั่งในตัว ข้อมูลโค้ดนี้จากลิงก์นั้นอาจเป็นที่สนใจ:
[bob in ~] declare -i VARIABLE=12
[bob in ~] VARIABLE=string
[bob in ~] echo $VARIABLE
0
[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"
นี่คือmandeclareหน้า
มันไม่เกี่ยวข้อง
วิธีเดียวที่จะโต้ตอบกับตัวแปร Bash คือผ่าน Bash ดังนั้นจึงเป็นไปไม่ได้ที่คุณจะสังเกตเห็นความแตกต่างของวิธีการจัดเก็บตัวแปรในหน่วยความจำเนื่องจากคุณไม่สามารถเข้าถึงพวกเขาผ่านหน่วยความจำโดยตรงคุณต้องถาม Bash คุณค่าและทุบตีสามารถแปลพวกเขาในสิ่งที่มันต้องการที่จะดูราวกับว่าพวกเขาได้รับการจัดเก็บในรูปแบบเฉพาะใด ๆ
ในความเป็นจริงพวกเขาอาจจะไม่ได้ถูกเก็บไว้ในหน่วยความจำที่ทุกคน ฉันไม่ทราบว่าการใช้งานร่วมกันของ Bash นั้นฉลาดแค่ไหน แต่อย่างน้อยก็เป็นไปได้ในกรณีง่าย ๆ เพื่อตรวจสอบว่าจะใช้ตัวแปรและ / หรือไม่ว่าจะมีการปรับเปลี่ยนหรือไม่และปรับให้เหมาะสมหรือไม่
bash)