ปัญหาพื้นฐานที่นี่คือผู้พัฒนาทุบตี (s) ที่ออกแบบ / ใช้งานอาร์เรย์จริง ๆ เมาสุนัข พวกเขาตัดสินใจว่านั่น${array}
เป็นแค่มือสั้น ๆ${array[0]}
ซึ่งเป็นความผิดพลาดที่ไม่ดี โดยเฉพาะอย่างยิ่งเมื่อคุณพิจารณาว่า${array[0]}
ไม่มีความหมายและประเมินเป็นสตริงว่างถ้าประเภทอาเรย์เป็นแบบเชื่อมโยงกัน
การกำหนดอาร์เรย์จะใช้รูปแบบarray=(value1 ... valueN)
ที่ค่ามีไวยากรณ์[subscript]=string
จึงกำหนดค่าโดยตรงไปยังดัชนีเฉพาะในอาร์เรย์ สิ่งนี้ทำให้สามารถมีสองประเภทของอาร์เรย์ดัชนีและ hash ดัชนี (เรียกว่าเชื่อมโยงอาร์เรย์ใน bash parlance) นอกจากนี้ยังทำให้คุณสามารถสร้างอาร์เรย์ที่จัดทำดัชนีเป็นตัวเลขได้ การออกจาก[subscript]=
ส่วนนั้นเป็นเพียงช่วงสั้น ๆ สำหรับอาเรย์ที่ทำดัชนีเป็นตัวเลขเริ่มต้นด้วยดัชนีลำดับที่ 0 และเพิ่มขึ้นด้วยค่าใหม่แต่ละค่าในคำสั่งการกำหนด
ดังนั้น${array}
ควรประเมินทั้งอาร์เรย์ดัชนีและทั้งหมด มันควรจะประเมินค่าผกผันของคำสั่งที่ได้รับมอบหมาย CS ที่สำคัญในปีที่สามควรรู้สิ่งนั้น ในกรณีนี้รหัสนี้จะทำงานอย่างที่คุณคาดหวัง:
declare -A foo bar
foo=${bar}
จากนั้นการส่งผ่านอาร์เรย์ตามค่าให้กับฟังก์ชั่นและการกำหนดหนึ่งอาเรย์ให้กับอีกอันหนึ่งจะใช้งานได้เมื่อเชลล์ที่เหลือของไวยากรณ์เชลล์สั่งการ แต่เนื่องจากพวกเขาทำสิ่งนี้ไม่ถูกต้องผู้ดำเนินการที่ได้รับมอบหมาย=
จึงไม่สามารถทำงานให้กับอาร์เรย์ได้และไม่สามารถส่งผ่านค่าอาร์เรย์ไปยังฟังก์ชันหรือไปยัง subshells หรือเอาต์พุตโดยทั่วไป ( echo ${array}
) โดยไม่ต้องใช้รหัสเพื่อให้เคี้ยวทั้งหมด
ดังนั้นถ้ามันถูกต้องแล้วตัวอย่างต่อไปนี้จะแสดงให้เห็นว่าการใช้ประโยชน์ของอาร์เรย์ใน bash นั้นดีกว่ามาก:
simple=(first=one second=2 third=3)
echo ${simple}
ผลลัพธ์ที่ได้ควรเป็น:
(first=one second=2 third=3)
จากนั้นอาร์เรย์สามารถใช้ตัวดำเนินการกำหนดค่าและส่งผ่านค่าไปยังฟังก์ชันและแม้แต่เชลล์สคริปต์อื่น ๆ จัดเก็บได้อย่างง่ายดายโดยการส่งออกไปยังไฟล์และโหลดจากไฟล์ลงในสคริปต์ได้อย่างง่ายดาย
declare -A foo
read foo <file
อนิจจาเราได้รับการลดลงโดยทีมพัฒนาทุบตีสุดยอดเป็นอย่างอื่น
ดังนั้นการส่งอาเรย์ไปยังฟังก์ชั่นจึงมีเพียงตัวเลือกเดียวเท่านั้นและนั่นคือการใช้คุณสมบัติ nameref:
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function
จะส่งผลให้ผลลัพธ์ต่อไปนี้:
indexes: foo zoom
values: bar fast
เนื่องจากสิ่งนี้ผ่านการอ้างอิงคุณยังสามารถกำหนดให้กับอาร์เรย์ในฟังก์ชันได้ ใช่อาร์เรย์ที่ถูกอ้างอิงจะต้องมีขอบเขตทั่วโลก แต่นั่นไม่ควรมีข้อตกลงที่ใหญ่เกินไปเมื่อพิจารณาว่านี่เป็นเชลล์สคริปต์ ในการส่งอาเรย์แบบดัชนีที่เชื่อมโยงหรือกระจัดกระจายโดยค่าไปยังฟังก์ชันต้องใช้การโยนดัชนีทั้งหมดและค่าลงในรายการอาร์กิวเมนต์ (ไม่มีประโยชน์มากเกินไปหากเป็นอาร์เรย์ขนาดใหญ่) เป็นสตริงเดี่ยวดังนี้
funky "${!array[*]}" "${array[*]}"
จากนั้นเขียนโค้ดจำนวนมากไว้ในฟังก์ชั่นเพื่อประกอบอาร์เรย์อีกครั้ง