နားလည်ထားရမယ့် အချက်
ပုံမှန် bash array သည် numeric index ဖြင့် ဝင်ရောက်ကြည့်ရှုနိုင်သော ordered value list တစ်ခုဖြစ်ပြီး၊ file1, file2, file3 ကဲ့သို့ variable အသီးသီး တိုးပွားလာနေမည့်အစား filename list သို့မဟုတ် username list ကဲ့သို့ ဆက်စပ်သော data များကို variable တစ်ခုတည်းအတွင်း စုစည်းသိမ်းဆည်းနိုင်စေသည်။ Indexed array များသည် position 0 မှ စတင်ပြီး၊ += operator ဖြင့် element ထပ်ထည့်လိုက်တိုင်း အလိုအလျောက် ကြီးထွားသွားကာ၊ တွဲဖက်အသုံးပြုလေ့ရှိသော expansion နှစ်ခု ရှိသည် — ${arr[@]} က element အားလုံးကို word သီးခြားစီအဖြစ် expand လုပ်ပေးပြီး၊ ${#arr[@]} က loop ပတ်ပြီး ရေတွက်စရာမလိုဘဲ element အရေအတွက်ကို တိုက်ရိုက် ပေးသည်။ Bash 4 နှင့်အထက်တွင် array အမျိုးအစား ဒုတိယတစ်ခုကို ထပ်ထည့်ထားသည် — declare -A ဖြင့် တိကျစွာ declare လုပ်ရသော associative array ဖြစ်ပြီး၊ sequential number အစား ကိုယ်ပိုင် string key များကို value နှင့် တွဲချိတ်ပေးနိုင်သည်။ ဤ explicit declaration က အရေးကြီးသည် — variable တစ်ခုသည် associative array ဖြစ်ကြောင်း bash ကို ကြိုတင်မသိစေပါက prices[apple]=1 ကို key lookup အဖြစ်မဟုတ်ဘဲ indexed array တွင်ကဲ့သို့ apple ကို arithmetic index အဖြစ် evaluate လုပ်ရန် ကြိုးစားလိမ့်မည်။ စောစီးစွာ နားလည်ထားသင့်သော nuance တစ်ခုမှာ indexed array ၏ သဘာဝကျသော numeric order နှင့်မတူဘဲ associative array ၏ key များတွင် guaranteed iteration order မရှိခြင်းဖြစ်သည် — report သို့မဟုတ် diff-friendly log ကဲ့သို့ ခန့်မှန်းနိုင်ပြီး ထပ်ခါထပ်ခါ တူညီသော output လိုအပ်သော script တိုင်းသည် loop မပတ်မီ key များကို ရှင်းရှင်းလင်းလင်း sort လုပ်ရမည်ဖြစ်ပြီး၊ ဤ lesson ၏ code တွင် ${!prices[@]} ကို sort ထဲသို့ pipe လုပ်ထားသကဲ့သို့ပင်ဖြစ်သည်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Directory အသေအချာအစုတစ်ခုကို backup လုပ်ရမည့် deployment script တစ်ခု၊ သို့မဟုတ် server name များကို IP address များနှင့် တွဲချိတ်ပေးရမည့် monitoring script တစ်ခု ရေးနေသည်ဟု စဉ်းစားကြည့်ပါ — ဤပြဿနာနှစ်မျိုးသည် bash ၏ array အမျိုးအစားနှစ်ခုနှင့် တိုက်ရိုက် ကိုက်ညီနေသည်။ directory list အတွက်ဆိုလျှင် code ထဲရှိ fruits=(apple banana cherry) ကဲ့သို့ပင် path များကို indexed array တွင် သိမ်းပြီး "${fruits[@]}" ကို loop ပတ်ခြင်းဖြင့် directory တစ်ခုစီကို logic တစ်ခုတည်းဖြင့် backup လုပ်နိုင်မည်ဖြစ်ပြီး၊ hardcode သုံးကြိမ် ထပ်ခါထပ်ခါ ရေးစရာမလိုတော့ပါ; နောက်ထပ် directory တစ်ခု ထပ်ထည့်ချင်လျှင် array ထဲသို့ line တစ်ကြောင်းသာ ထည့်ရုံသာဖြစ်ပြီး script block တစ်ခုလုံး ထပ်ရေးစရာမလိုပါ။ server-to-IP mapping အတွက်မူ indexed array ကိုသုံးလျှင် index 0 က 'web-server' ဖြစ်ပြီး index 1 က 'db-server' ဖြစ်ကြောင်း မှတ်ထားရမည်ဖြစ်၍ ချို့ယွင်းလွယ်ပြီး ဖတ်ရခက်သည်။ code ထဲရှိ prices ကဲ့သို့ associative array က ဤပြဿနာကို တိုက်ရိုက် ဖြေရှင်းပေးသည် — declare -A prices ပြီးနောက် prices[apple]=1 သည် memorize ထားရမည့် position အစား အဓိပ္ပာယ်ရှိသော name တစ်ခုဖြင့် ${prices[banana]} ကဲ့သို့ value ကို ရှာဖွေနိုင်စေသည်။ associative array key order ကို အာမမခံနိုင်သောကြောင့် code က ${!prices[@]} ဖြင့် key များကို ရယူပြီး tr နှင့် sort ထဲသို့ pipe လုပ်ကာ ထို့နောက်မှသာ loop ပတ်ရန် တမင် ရွေးချယ်ထားသည် — associative array မှ report သို့မဟုတ် log တစ်ခု တည်ဆောက်ပြီး run တိုင်း output တူညီစေလိုသည့်အခါတိုင်း ပြန်လည်အသုံးချသင့်သော pattern တစ်ခုဖြစ်သည်။
အတူတူ စမ်းရေးကြည့်မယ်
#!/bin/bash
# Indexed array: an ordered list of values
fruits=(apple banana cherry)
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"
echo "Number of fruits: ${#fruits[@]}"
# Append a new element
fruits+=(date)
echo "After append: ${fruits[@]}"
# Loop over every element
for fruit in "${fruits[@]}"; do
echo "I like $fruit"
done
# Associative array (bash 4+): key-value pairs
declare -A prices
prices[apple]=1
prices[banana]=2
prices[cherry]=3
echo "Price of banana: ${prices[banana]}"
# Sort keys before looping so output order is predictable
for key in $(echo "${!prices[@]}" | tr ' ' '\n' | sort); do
echo "$key costs ${prices[$key]}"
doneဤ script ကို run လိုက်လျှင် အောက်ပါအတိုင်း output ရရှိမည်−
First fruit: apple
All fruits: apple banana cherry
Number of fruits: 3
After append: apple banana cherry date
I like apple
I like banana
I like cherry
I like date
Price of banana: 2
apple costs 1
banana costs 2
cherry costs 3၅ မိနစ် စမ်းကြည့်
သင်နှစ်သက်သော programming language သုံးခုပါဝင်သည့် indexed array တစ်ခု ဖန်တီးပြီး total count ကို print လုပ်ပါ။ ထို့နောက် language တစ်ခုချင်းစီကို ၎င်းစတင်ပေါ်ပေါက်သည့်နှစ်နှင့် တွဲချိတ်ပေးသော associative array တစ်ခု ရေးပြီး pair တစ်စုံကို print ထုတ်ပါ။
သတိလေးတစ်ချက်
for loop ထဲတွင် "${arr[@]}" ကို quote မလုပ်ဘဲ ချန်ထားခြင်း — space ပါသော element များကို word အများအပြားအဖြစ် ခွဲစိတ်သွားစေသည်
${arr[@]} (element အားလုံး) ကို ${arr[*]} သို့မဟုတ် index မပါသော ရိုးရိုး $arr (ပထမ element ကိုသာ ရည်ညွှန်း) နှင့် ရောထွေးနားလည်ခြင်း
GNU Bash Manual: Arrays — Bash / Shell Scripting