နားလည်ထားရမယ့် အချက်
bash script တွေက web API တစ်ခုနဲ့ ပြောနေရတတ်တယ် — service ရဲ့ health စစ်တာ, deployment status ဆွဲတာ, webhook တစ်ခု trigger လုပ်တာ — ပြီးတော့ command line ကနေ HTTP request ပို့ဖို့ standard tool ကတော့ curl ပါ။ curl -s က request ကို curl ရဲ့ ပုံမှန် progress meter မပါဘဲ တိတ်တိတ်ဆိတ်ဆိတ် ပို့ပေးပေမယ့် -s က curl ကိုယ်တိုင်ရဲ့ error message တွေကိုပါ တိတ်ဆိတ်စေတယ်ဆိုတာ သတိထားပါ၊ ဒါကြောင့် script အများစုက progress bar ကို ဖုံးထားရင်းနဲ့ error တွေကို မြင်နေနိုင်ဖို့ -S နဲ့ ပေါင်းသုံးကြတယ် (curl -sS)။ -w "%{http_code}" သုံးပြီး response body နဲ့အတူ HTTP status code ကို ဖမ်းယူနိုင်တယ်၊ ဒါမှမဟုတ် -f နဲ့ short-cut လုပ်လို့ရတယ် — ဒါက 4xx/5xx response ရလာရင် curl ကိုယ်တိုင် nonzero exit status ပြန်စေတယ်၊ ဒါက အသုံးဝင်တယ် ဘာလို့ဆိုတော့ ကိုယ်တိုင် status check ရေးစရာမလိုဘဲ set -e script က response မကောင်းရင် အလိုအလျောက် ရပ်သွားနိုင်လို့ပါ၊ ဒါပေမယ့် -f က error တက်ရင် response body ကိုပါ ဖျောက်ပစ်တယ်၊ ဒါကြောင့် fail တဲ့အခါ server က တကယ်ဘာပြောထားလဲ ကြည့်ချင်ရင် status code နဲ့ body ကို သီးခြားစီ ဖမ်းယူပြီး လက်နဲ့ စစ်ဆေးတာက ပိုကောင်းတယ်။ JSON body ရလာတာနဲ့ curl ကို ဒါထက်ပို ဘာမှ မလုပ်နိုင်တော့ဘူး — အဲဒါ jq ရဲ့ အလုပ်ပါ။ jq '.field' က field တစ်ခုကို JSON အနေနဲ့ print ပေးတယ် — string value ဆိုရင် JSON encode လုပ်သလိုပဲ quote ပါလာတယ်၊ jq -r '.field' ကတော့ တန်ဖိုးအတူတူကို 'raw' အနေနဲ့ quote ဖယ်ပြီး print ပေးတယ်၊ ဒါက bash variable ထဲ assign လုပ်တဲ့အခါ လိုချင်တဲ့ ပုံစံအမှန်ပါပဲ၊ မဟုတ်ရင် literal quote character တွေက variable ရဲ့ value ထဲ ထည့်ကျန်ခဲ့လိမ့်မယ်။ jq က .roles[0] နဲ့ array ထဲကိုလည်း index လုပ်နိုင်တယ်၊ lookup များစွာကို chain ချိတ်နိုင်တယ်၊ . ပဲ ပေးလိုက်ရင် object တစ်ခုလုံးကို pretty-print လုပ်ပေးတယ် — ပြီးတော့ curl လိုပဲ jq ကိုယ်တိုင်လည်း invalid JSON ရလာရင် nonzero exit status ပြန်တယ်၊ ဒါကို set -e script က ဖမ်းနိုင်တယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
rollout မလုပ်ခင် status API တစ်ခုကို ping လုပ်ပြီး လက်ရှိ deploy ထားတဲ့ version ကို ထုတ်ယူပြီး deploy မယ့် version အသစ်နဲ့ ကွာခြားမှသာ ဆက်လုပ်မယ့် deploy script တစ်ခု ရေးနေတယ်ဆိုပါစို့ — မလိုအပ်တဲ့ redeploy တွေကို ရှောင်ဖို့ပါ။ script က curl -sf သုံးပြီး JSON status ကို ရယူလိမ့်မယ်၊ API ကို ဆက်သွယ်မရရင် ဒါမှမဟုတ် error ပြန်ရင် nonzero exit နဲ့ ကျယ်ကျယ်လောင်လောင် fail သွားစေမယ်၊ ဒါက service ဆက်သွားချင်တောင် run ဖြစ်နေချင်မှမှန်တဲ့ တစ်ခုကို ဆက်လက် deploy လုပ်မယ့်အစား set -e ကို အဲဒီနေရာမှာ ချက်ချင်း ရပ်စေမယ်။ JSON body ရလာပြီးရင် jq -r '.version' က version string ကိုပဲ quote ပါဝန်းရံမှု ဖယ်ပြီး ထုတ်ယူပေးလို့ [ "$current_version" = "$new_version" ] လို plain bash string comparison နဲ့ တိုက်ရိုက် နှိုင်းယှဉ်နိုင်တယ်။ jq မရှိရင် field တစ်ခုတည်းကို sed ဒါမှမဟုတ် grep နဲ့ regex သုံးပြီး ထုတ်ဖို့ ကြိုးစားနေရမှာပါ — technically အလုပ်လုပ်ပေမယ့် API ရဲ့ format အနည်းငယ် ပြောင်းသွားရင်ပင် (field order ပြောင်းတာ, whitespace ထပ်ပါလာတာ, nested object အသစ် ထည့်လိုက်တာ) regex က တိတ်ဆိတ်စွာ ပျက်စီးသွားတတ် ဒါမှမဟုတ် လွဲမှားတဲ့ ဟာကို match ဖြစ်သွားတတ်တယ်၊ jq ကတော့ JSON structure ကို တကယ် parse လုပ်တဲ့အတွက် text ပေါ်မှာ pattern-match လုပ်နေတာ မဟုတ်ဘဲ ဆက်အလုပ်လုပ်နေမှာပါ။
အတူတူ စမ်းရေးကြည့်မယ်
#!/bin/bash
set -euo pipefail
# In a real script you would fetch this with curl, e.g.:
# response=$(curl -sf -w "\n%{http_code}" "https://api.example.com/users/42")
# http_code=$(echo "$response" | tail -n1)
# body=$(echo "$response" | sed '$d')
# [ "$http_code" = "200" ] || { echo "request failed: $http_code" >&2; exit 1; }
#
# Here we use a literal JSON string standing in for that response body,
# so the example is deterministic and needs no network access.
response='{"id":42,"name":"Ada Lovelace","active":true,"roles":["admin","editor"]}'
echo "Full response:"
echo "$response" | jq '.'
name=$(echo "$response" | jq -r '.name')
echo "Extracted name: $name"
first_role=$(echo "$response" | jq -r '.roles[0]')
echo "First role: $first_role"
is_active=$(echo "$response" | jq '.active')
echo "Active field (raw JSON value): $is_active"
အထက်ပါ script ကို run လိုက်ရင် ဒီအတိုင်း output ထွက်ပါမယ်:
Full response:
{
"id": 42,
"name": "Ada Lovelace",
"active": true,
"roles": [
"admin",
"editor"
]
}
Extracted name: Ada Lovelace
First role: admin
Active field (raw JSON value): true၅ မိနစ် စမ်းကြည့်
jq ဥပမာကို extend လုပ်ပြီး roles array ကနေ ပထမဆုံးအစား ဒုတိယ role ကို ထုတ်ယူပါ၊ ပြီးရင် jq ရဲ့ length filter သုံးပြီး array ထဲမှာ role ဘယ်နှစ်ခု ပါလဲဆိုတာ print ထုတ်မယ့် လိုင်းတစ်ကြောင်း ထပ်ထည့်ပါ။
သတိလေးတစ်ချက်
-r ကို မေ့ကျန်ပြီး jq ရဲ့ quote ပါတဲ့ JSON string output ကို bash variable ထဲ တိုက်ရိုက် assign လုပ်ခြင်း — value ထဲမှာ literal double quote တွေ ပါဝင်သွားလိမ့်မယ်
jq ထဲ pipe မလုပ်ခင် curl ရဲ့ exit status ဒါမှမဟုတ် HTTP code ကို မစစ်ဆေးခြင်း — request fail သွားရင် error page ဒါမှမဟုတ် empty body က jq ကို 'parse error' နဲ့ fail စေတတ်ပြီး တကယ့်အကြောင်းရင်းနဲ့ ဝေးနေတတ်တယ်
jq Manual — Bash / Shell Scripting