ตัวชี้ (ไปยังตำแหน่งของหน่วยความจำ ) ไม่ใช่แนวคิดที่มีประโยชน์ในระดับที่สูงกว่า C ไม่ว่าจะเป็น Python หรือเชลล์ แน่นอนการอ้างอิงไปยังวัตถุมีประโยชน์ในภาษาระดับสูงบางทีอาจจำเป็นสำหรับการสร้างโครงสร้างข้อมูลที่ซับซ้อน แต่ในกรณีส่วนใหญ่การคิดในแง่ของที่อยู่หน่วยความจำอยู่ในระดับต่ำเกินไปที่จะมีประโยชน์มาก
ในทุบตี (และหอยอื่น ๆ ) คุณจะได้รับค่าขององค์ประกอบมากมายกับที่${array[index]}สัญกรณ์กำหนดพวกเขาด้วยและได้รับจำนวนขององค์ประกอบในอาร์เรย์ที่มีarray[index]=... ${#array[@]}การแสดงออกภายในวงเล็บคือการแสดงออกทางคณิตศาสตร์ เป็นตัวอย่างที่สร้างขึ้นเราสามารถเพิ่มคำนำหน้าคงที่ให้กับสมาชิกอาเรย์ทั้งหมด:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(ถ้าเราใส่ใจเฉพาะค่าและไม่ใช่ดัชนีเพียง แต่for x in "${array[@]}" ; do...จะไม่เป็นไร)
ด้วยอาเรย์แบบเชื่อมโยงหรือกระจัดกระจายการวนรอบตัวเลขไม่สมเหตุสมผล แต่เราต้องการดึงคีย์ / ดรรชนีอาเรย์${!array[@]}แทน เช่น
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
นอกจากนั้น Bash มีสองวิธีในการชี้ทางอ้อมไปยังตัวแปรอื่น:
- การขยายตัวทางอ้อมโดยใช้ไวยากรณ์ซึ่งใช้ค่าของตัวแปรที่มีชื่ออยู่ในและ
${!var}var
- namerefsซึ่งจะต้องสร้างขึ้นด้วย
declarebuiltin (หรือ - kshพ้องความหมายที่เข้ากันได้typeset) declare -n ref=varทำให้มีการอ้างอิงถึงตัวแปรrefvar
Namerefs การจัดทำดัชนียังสนับสนุนในว่าถ้าเรามีarr=(a b c); declare -n ref=arr;แล้วจะขยายไปยัง${ref[1]} bการใช้${!p[1]}จะใช้pเป็นอาร์เรย์แทนและอ้างถึงตัวแปรที่ตั้งชื่อโดยองค์ประกอบที่สอง
ใน Bash namerefs นั้นแท้จริงแล้วอ้างอิงโดยชื่อและการใช้ nameref จากภายในฟังก์ชั่นจะใช้ค่าท้องถิ่นของตัวแปรที่มีชื่อ local value of varนี้จะพิมพ์
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ มีบทความยาวเกี่ยวกับการอ้อมเช่นกัน