เชลล์ที่มีอาร์เรย์เชื่อมโยง
เชลล์สมัยใหม่บางตัวมีอาร์เรย์เชื่อมโยง: ksh93, bash ≥4, zsh ใน ksh93 และ bash หากa
เป็นอาร์เรย์ที่เชื่อมโยงแล้ว"${!a[@]}"
จะเป็นอาร์เรย์ของคีย์:
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
ใน zsh ไวยากรณ์นั้นทำงานในโหมดการจำลอง ksh เท่านั้น มิฉะนั้นคุณต้องใช้ไวยากรณ์ดั้งเดิมของ zsh:
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
สามารถใช้งานได้หากa
ไม่มีคีย์ว่าง
ใน zsh คุณสามารถวนซ้ำทั้งk
eys และv
alues ได้ในเวลาเดียวกัน:
for k v ("${(@kv)a}") echo "$k -> $v"
เชลล์ที่ไม่มีอาร์เรย์เชื่อมโยง
การเลียนแบบอาร์เรย์ที่เชื่อมโยงกันในเชลล์ที่ไม่มีพวกมันนั้นทำงานได้มากขึ้น หากคุณต้องการอาเรย์แบบเชื่อมโยงอาจถึงเวลาที่ต้องใช้เครื่องมือที่ใหญ่กว่าเช่น ksh93 หรือ Perl
หากคุณต้องการอาเรย์เชื่อมโยงในเชลล์ POSIX เพียงนี่คือวิธีในการจำลองเมื่อคีย์ถูก จำกัด ให้มีเพียงอักขระ0-9A-Z_a-z
(ตัวเลข ASCII ตัวอักษรและขีดล่าง) ภายใต้สมมติฐานนี้คีย์สามารถใช้เป็นส่วนหนึ่งของชื่อตัวแปร ฟังก์ชั่นด้านล่างดำเนินการกับอาเรย์ที่ระบุโดยคำนำหน้าการตั้งชื่อ "ต้นกำเนิด" ซึ่งจะต้องไม่มีขีดล่างสองอันติดต่อกัน
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo \"\$__aa__${1}\""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case \$__aa__${1} in
*\" $2 \"*) $3=\$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=\$3
case \$__aa__${1} in
*\" $2 \"*) :;;
*) __aa__${1}=\"\${__aa__${1}}$2 \";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case \$__aa__${1} in
*\" $2 \"*) __aa__${1}=\"\${__aa__${1}%%* $2 } \${__aa__${1}#* $2 }\";;
esac"
}
(คำเตือนรหัสที่ยังไม่ผ่านการทดสอบการตรวจหาข้อผิดพลาดสำหรับลำต้นและคีย์ที่ไม่ถูกต้องไม่ได้ให้ไว้)