နားလည်ထားရမယ့် အချက်
Bash တွင် variable တစ်ခုကို `name=value` ဖြင့် သတ်မှတ်ရပြီး `=` ၏ နှစ်ဖက်တွင် space လုံးဝ မထားရပါ — space ထားလိုက်လျှင် bash က `name` ကို command တစ်ခုအဖြစ်၊ `=value` ကို ၎င်း၏ argument အဖြစ် parse လုပ်ရန် ကြိုးစားမည်ဖြစ်သောကြောင့်ဖြစ်သည်။ ပြန်ခေါ်ရန် `$name` (သို့) ပို၍ ရှင်းလင်းသော `${name}` ကို သုံးရပြီး၊ variable name ၏ ရှေ့နောက်တွင် character အခြားများ ချိတ်ဆက်နေလျှင် (ဥပမာ `${name}_backup`) `{}` ကို မလွဲမသွေ သုံးရမည်ဖြစ်သည် — မဟုတ်လျှင် bash က ၎င်း character များကို identifier ထဲသို့ ထည့်သွင်း parse လုပ်ပစ်နိုင်သည်။ ထိုအခေါ်ကို quote လုပ်ပုံက အလွန်အရေးကြီးသည်။ Single quote ထဲရှိ အရာအားလုံးကို literal text အဖြစ်သာ သဘောထားပြီး variable expansion၊ command substitution၊ escape sequence မည်သည့်တစ်ခုမျှ အလုပ်မလုပ်ပါ — ရိုက်ထည့်ထားသည့်အတိုင်း အတိအကျ ထိန်းထားလိုသည့်အခါ safest ရွေးချယ်မှုဖြစ်သည်။ Double quote က variable နှင့် command substitution များကို expand ဆက်လုပ်သော်လည်း ပေါင်းစည်းရလဒ်ကို word တစ်ခုတည်းအဖြစ် ထိန်းထားပြီး ၎င်းအတွင်းရှိ space များကို ခွဲမသွားစေပါ။ Quote လုံးဝမပါခြင်းသည် အန္တရာယ်အများဆုံး default ဖြစ်သည် — bash က variable ကို ပထမ expand လုပ်ပြီးမှ word splitting (whitespace ပေါ်တွင် ရလဒ်ကို ခွဲခြင်း) နှင့် filename globbing (`*` ကဲ့သို့ pattern များကို expand လုပ်ခြင်း) ကို ထွက်လာသော ရလဒ်ပေါ်တွင် ဆက်လုပ်ပြီး၊ value တစ်ခုတည်းကို argument များစွာအဖြစ် တိတ်တဆိတ် ပြောင်းသွားနိုင်သည် (သို့) ဆိုလိုမထားသော file များကို match ဖြစ်သွားစေနိုင်သည်။ `$(command)` ဖြင့် command substitution သည် command တစ်ခု၏ standard output ကို variable ထဲသို့ ဖမ်းယူပေးပြီး — trailing newline များကို ဖြတ်ပစ်ပါသည် — ထိုသို့ variable ထဲ သိမ်းပြီးနောက် ၎င်းကို ထပ်သုံးလျှင် တခြား variable များနည်းတူပင် quoting rule အတူတူကိုပင် လိုက်နာရသည်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
File path များကို process လုပ်သော script တစ်ခုသည် ဒီပြဿနာအကြံဆုံးဖြစ်တဲ့နေရာပါ — `/home/user/My Documents/report.pdf` လို path မှာ space ပါနေပြီး၊ `rm "$filepath"` အစား `rm $filepath` ဟု ရေးလိုက်ရင် bash က `$filepath` ကို ပထမ expand လုပ်ပြီးမှ၊ quote မပါသောကြောင့် ရလဒ်ကို whitespace ပေါ်တွင် argument နှစ်ခု — `/home/user/My` နှင့် `Documents/report.pdf` — အဖြစ် ခွဲသွားမှာဖြစ်ပြီး၊ ဘယ်တစ်ခုမှ ကိုယ်ရည်ညွှန်းလိုတဲ့ file မဟုတ်ဘဲ `rm` က 'no such file' ဖြင့် fail ဖြစ်သွားနိုင်သည် (သို့) ပိုဆိုးသည်မှာ ကိုယ်မဖျက်လိုသော အရာကို ဖျက်မိသွားနိုင်သည်။ Lesson ၏ ဥပမာကိုယ်တိုင်ကလည်း ဒါကို တိုက်ရိုက် ပြသထားသည် — quote မပါဘဲ `$path` ပေါ်တွင် loop လုပ်လိုက်လျှင် `/tmp/my folder/file.txt` ကို word နှစ်ခုအဖြစ် ခွဲသွားပြီး၊ `"$path"` ဟု quote ပါ loop လုပ်လိုက်လျှင်မူ word တစ်ခုတည်းအဖြစ် ထိန်းထားပေးသည်။ Variable reference တိုင်းကို default အနေနဲ့ double-quote လုပ်တတ်တဲ့ အလေ့အထ ရအောင်လုပ်ထားပြီး၊ literal text ကို တမင်လိုချင်ချိန်မှသာ single quote ကို သုံးရင် ဒီလို bug အမျိုးအစားလုံးကို မဖြစ်ခင် ကာကွယ်နိုင်ပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
#!/usr/bin/env bash
name="Bash Learner"
single_quoted='Hello, $name!' # single quotes: fully literal, no expansion
double_quoted="Hello, $name!" # double quotes: variables expand
shout=$(echo "hello there" | tr 'a-z' 'A-Z') # command substitution
echo "Single-quoted: $single_quoted"
echo "Double-quoted: $double_quoted"
echo "Command substitution: $shout"
path="/tmp/my folder/file.txt"
echo "Unquoted (word splitting):"
for word in $path; do
echo " word -> $word"
done
echo "Quoted (no splitting):"
for word in "$path"; do
echo " word -> $word"
doneဤ script ကို run လိုက်လျှင် အောက်ပါအတိုင်း ထွက်ပါမည်:
Single-quoted: Hello, $name!
Double-quoted: Hello, Bash Learner!
Command substitution: HELLO THERE
Unquoted (word splitting):
word -> /tmp/my
word -> folder/file.txt
Quoted (no splitting):
word -> /tmp/my folder/file.txt၅ မိနစ် စမ်းကြည့်
Space ပါသော path တစ်ခုကို variable ထဲထားပါ၊ ဥပမာ `project_dir="my project/src"`၊ ပြီးရင် `$project_dir` ကို quote ပါလျှင်နှင့် quote မပါလျှင် ရလဒ်ဘယ်လိုကွာသွားလဲ ကြည့်ရန် loop တစ်ခု ရေးပါ။
သတိလေးတစ်ချက်
Space ပါနိုင်သော variable ကို quote လုပ်ဖို့ မေ့ပြီး bash က word split လုပ်ကာ argument များစွာဖြစ်သွားခြင်း (ဥပမာ rm $filepath က မှားယွင်းသော file များကို ဖျက်မိခြင်း)
Single quote ကို double quote လိုပဲ အလုပ်လုပ်တယ်လို့ ထင်ပြီး 'Hello, $name!' က value ကို substitute မလုပ်ဘဲ literal အတိုင်း print ထွက်လာချိန် အံ့သြနေခြင်း
GNU Bash Reference Manual — Quoting — Bash / Shell Scripting