ตัวแปรทั้งหมดถูกจัดเก็บในหน่วยความจำเป็นสตริงในทุบตีหรือไม่?


14

ว่าฉันสร้างตัวแปรต่อไปนี้:

s=John
i=12345
f=3.14

ตัวแปรเหล่านี้ทั้งหมดถูกจัดเก็บในหน่วยความจำเป็นสตริงหรือbashมีชนิดข้อมูลอื่นหรือไม่?


1
เพียงแค่สนใจทำไมมันถึงสำคัญ? ฉันไม่สนหรอกถ้าเก็บไว้เป็นข้อความภาษาสวาฮิลีตราบใดที่มันไม่ได้ส่งผลกระทบต่อการทำงานของภาษา (ส่งผลกระทบต่อประสิทธิภาพอาจเป็นปัญหา แต่ถ้าเป็นสิ่งสำคัญพวกเขาเป็นเครื่องมือที่ดีกว่าในคลังแสงของคุณbash)

2
@paxdiablo มันไม่สำคัญเลยฉันแค่ขอความอยากรู้อยากเห็นเนื่องจากภาษาการเขียนโปรแกรม / สคริปต์อื่น ๆ ทั้งหมดที่ฉันรู้ (เช่น: Java, C ++, JavaScript, PHP, ฯลฯ ) มีการแสดงหน่วยความจำที่ไม่ซ้ำกันสำหรับแต่ละประเภทข้อมูล ดังนั้นจึงน่าสนใจที่จะเห็นภาษาสคริปต์ที่มีหน่วยความจำเพียงหนึ่งเดียวสำหรับทุกประเภทข้อมูล
268325

คำตอบ:


16

ตัวแปร 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.

อ้างอิง:


13

Bash เป็นหลักมีตัวแปรสเกลาร์ธรรมดา, อาร์เรย์, และอาเรย์แบบเชื่อมโยง นอกจากนี้สเกลาสามารถติดแท็กเป็นจำนวนเต็มด้วยในตัวdeclare จากมุมมองของผู้ใช้ / โปรแกรมเมอร์ของเชลล์สคริปต์ตัวแปรสตริงทำหน้าที่เป็นสตริงตัวแปรจำนวนเต็มทำหน้าที่เป็นจำนวนเต็มและอาร์เรย์ตามประเภทของพวกเขา การดำเนินการภายในไม่เกี่ยวข้องมาก


แต่ถ้าเราต้องการทราบวิธีการจัดเก็บข้อมูลจริงในหน่วยความจำเราต้องตรวจสอบซอร์สโค้ดเพื่อดูว่าโปรแกรมทำอะไร

ใน Bash 4.4 สเกลาร์จะถูกเก็บเป็นสตริงโดยไม่คำนึงถึงแท็กจำนวนเต็ม สิ่งนี้สามารถมองเห็นได้ในคำจำกัดความของstruct variable/ the SHELL_VARtypedefและในฟังก์ชันmake_variable_valueซึ่งแปลจำนวนเต็มเป็นสตริงสำหรับการจัดเก็บอย่างชัดเจน

อาร์เรย์ถูกเก็บไว้ในสิ่งที่ดูเหมือนว่าจะเป็นรายการที่เชื่อมโยง ( array.h) และเชื่อมโยงอาร์เรย์เป็นตารางแฮช ค่าภายในจะถูกเก็บไว้เป็นสตริงอีกครั้ง ตัวเลือกของรายการที่เชื่อมโยงสำหรับอาร์เรย์อาจดูแปลก แต่เมื่ออาร์เรย์สามารถกระจัดกระจายและดัชนีสามารถเป็นตัวเลขโดยไม่คำนึงว่าองค์ประกอบมีกี่อาร์เรย์ที่มีอยู่ตัวเลือกการออกแบบนั้นง่ายกว่าที่จะเข้าใจ

อย่างไรก็ตามรหัสดังกล่าวยังมีคำจำกัดความสำหรับส่วนที่ไม่ได้ใช้union _valueโดยมีเขตข้อมูลสำหรับตัวเลขจำนวนเต็มหมายเลขจุดลอยตัวและค่าสตริง มันถูกทำเครื่องหมายไว้ในความคิดเห็นว่า "สำหรับอนาคต" ดังนั้นจึงเป็นไปได้ว่า Bash รุ่นอนาคตจะเก็บสเกลาร์ประเภทต่าง ๆ ไว้ในรูปแบบดั้งเดิม


1

สำหรับชีวิตของฉันฉันไม่สามารถค้นหาสิ่งนี้ได้ที่ใดก็ได้ในหลาย ๆ คำ แต่นี่คือสิ่งที่ฉันเข้าใจ

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มีการเป็นตัวแทนภายในที่เปลี่ยนแปลงด้วยแฟล็กแอ็ตทริบิวต์สตริงเป็นสิ่งที่ทุบตีเห็นหรือต้องการที่จะเห็น


0

หน้านี้มีคำแนะนำที่ครอบคลุมเกี่ยวกับการพิมพ์ตัวแปรใน 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หน้า


0

มันไม่เกี่ยวข้อง

วิธีเดียวที่จะโต้ตอบกับตัวแปร Bash คือผ่าน Bash ดังนั้นจึงเป็นไปไม่ได้ที่คุณจะสังเกตเห็นความแตกต่างของวิธีการจัดเก็บตัวแปรในหน่วยความจำเนื่องจากคุณไม่สามารถเข้าถึงพวกเขาผ่านหน่วยความจำโดยตรงคุณต้องถาม Bash คุณค่าและทุบตีสามารถแปลพวกเขาในสิ่งที่มันต้องการที่จะดูราวกับว่าพวกเขาได้รับการจัดเก็บในรูปแบบเฉพาะใด ๆ

ในความเป็นจริงพวกเขาอาจจะไม่ได้ถูกเก็บไว้ในหน่วยความจำที่ทุกคน ฉันไม่ทราบว่าการใช้งานร่วมกันของ Bash นั้นฉลาดแค่ไหน แต่อย่างน้อยก็เป็นไปได้ในกรณีง่าย ๆ เพื่อตรวจสอบว่าจะใช้ตัวแปรและ / หรือไม่ว่าจะมีการปรับเปลี่ยนหรือไม่และปรับให้เหมาะสมหรือไม่


ฉันคิดว่าประเด็นของคำถามคือการเป็นตัวแทนมากกว่าที่ตั้ง
bu5hman

2
ประเด็นของฉันคือคุณไม่สามารถรู้ถึงการเป็นตัวแทนเพราะคุณไม่สามารถสังเกตได้ ดังนั้นมันไม่เกี่ยวข้องและอาจเปลี่ยนแปลงได้โดยที่คุณไม่สังเกตเห็น มันเป็นไปไม่ได้เลยที่จะบอกว่า Bash อาจเลือกตัวแทนอะไร คุณสามารถเจาะลึกลงไปในซอร์สโค้ดของการนำไปใช้และตรวจสอบว่ามีการนำเสนอใดบ้าง แต่สามารถเปลี่ยนการนำเสนอในวันพรุ่งนี้ในการเปิดตัวแพตช์ถัดไปและจะไม่มีทางที่คุณจะรู้
Jörg W Mittag

ตัวแปร Schroedingers? ฉันเห็นด้วยกับคุณเกี่ยวกับพื้นฐานการแสดงที่ไม่เกี่ยวข้อง (ดูคำตอบของฉัน) แต่ในการใช้ bash เราจะ 'เข้ารหัสไปยังส่วนต่อประสาน' ได้อย่างมีประสิทธิภาพและการแสดงที่ส่วนต่อประสานนั้นมีความเข้มงวด
bu5hman

2
ใช่ แต่คำถามไม่ได้เกี่ยวกับการเป็นตัวแทนที่ขอบเขตของอินเตอร์เฟส แต่โดยเฉพาะเกี่ยวกับวิธีที่พวกเขา "เก็บไว้ในหน่วยความจำ" และสำหรับคำถามนั้นฉันจะตอบว่า: เราทำไม่ได้ไม่ควรและไม่รู้
Jörg W Mittag

ข้อใดที่แปลความหมายบรรทัดสุดท้ายของโพสต์ของตัวเอง ..... ดังที่ฉันพูดเราเห็นด้วย ...... และได้รับตัวแทนและธรรมชาติของคำถามฉันคิดว่าพวกเขาจะได้รับเครื่องหมายที่สมเหตุสมผลสำหรับการบ้านของพวกเขา รับการเสนอราคา ;-)
bu5hman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.