管理系コマンドを作る時に本気で作る時はGo言語なりで書くのだけど、とりあえず動くだけで良い時は内部的にはcurl投げてるだけとかgcloudなど別の管理コマンドの結果をjqで加工して組合わせてるだけで済ましたい時は良くある。
とはいえ、設定ファイルらしきものを読み込みたいし、環境変数で上書きもしたい。あとサブコマンドも欲しい。getoptも良いけど、あれはサブコマンドに対応してないのが難点。
という分けで以下のように作ったのだけどたぶん忘れるので投稿しとく。めんどくさいからrubyで書いたワンライナーは後でperlかawkに直しておか無いとなぁ。
#!/bin/bash## Usage#function usage {cat<<EOM
Usage: $(basename"$0") [optional flags] [command] args
GLOBAL FLAGS
-h|--help Display help
-v|--verbose Make the operation more talkative
COMMANDS
deploy {FLOW_FILE} Deploy flow
--help Sub Flag
flows Show flows
triggers {FLOW_NAME} {ENDPOINT_NAME} Show triggers
EOM
exit 2
}## Load config#[[-z"${API_URL}"]]&&API_URL=$(cat${HOME}/.kuda_config|grep URL:|awk '{print $2}')## Define variable#CURL_OPTIONS=""## Parse options#OPTIONS=($(echo$@ | ruby -ne'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[0].join(" ")'))ARGS=($(echo$@ | ruby -ne'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[1].join(" ")'))SUBCMD=${ARGS[0]}SUBOPT=($(echo${ARGS[@]:1} | ruby -ne'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[0].join(" ")'))SUBARGS=($(echo${ARGS[@]:1}| ruby -ne'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[1].join(" ")'))## If no arguments#if["$1"=""];then
usage
fi## Options#for opt in${OPTIONS[@]};do
case"$opt"in'-v'|'--verbose')CURL_OPTIONS=" -v "$CURL_OPTIONS;;'-h'|'--help') usage ;;esacdone## Sub Commands#case"${SUBCMD}"in"deploy")"run")for opt in${SUBOPT[@]};do
case"$opt"in'--help')echo"This is a sub-flag";;esacdone
FLOW_FILE=${SUBARGS[0]}
gsutil cp$FLOW_FILE gs://afeafgeae-kuda-flow
curl ${CURL_OPTIONS}-X POST ${API_URL}/management/load
;;"flows")
curl ${CURL_OPTIONS}-X GET ${API_URL}/management/flows
;;"triggers")FLOW_NAME=${SUBARGS[0]}ENDPOINT_NAME=${SUBARGS[1]}
curl ${CURL_OPTIONS}-X GET ${API_URL}/management/triggers/${FLOW_NAME}/${ENDPOINT_NAME};;"help")
usage
;;esac