kawakazuの日記: シェルスクリプトのcaseコマンドについて 8
以下のようなシェルスクリプトで
caseを入れ子で使ったらなんか嫌だと言われた
#!/bin/bash
:$1 $2
ENV1=$1
ENV2=$2case ${ENV1} in
dev ) TENANT_NAME="${ENV1}_${ENV2}" ;;
pre )
case ${ENV2} in
stg ) TENANT_NAME="${ENV1}_stg" ;;
ut* ) TENANT_NAME="${ENV1}_ut" ;;
*) echo "Not support" && exit 0 ;;
esac
*) echo "Not support" && exit 0 ;;
esac略
#!/bin/bash
: "$1" "$2"ENV1=$1
ENV2=$2
ENV3=${3:-""}# Set variable
case "${ENV1}" in
dev )
TENANT_NAME="${ENV1}_${ENV2}"
;;
pre )
case "${ENV2}" in
stg ) TENANT_NAME="${ENV1}_stg" ;;
ut* ) TENANT_NAME="${ENV1}_ut" ;;
* ) echo "Not support"
exit 0 ;;
esac
;;
*)
echo "Not support"
exit 0
;;
esac# Main
./tenant_build.sh "${TENANT_NAME}" "${ENV3}"
~略~
※20220915修正
2つ目のCaseはif的な使い方で利用している形で作成したら
内部レビューで微妙といわれた
ifを使うと余計見辛いと思ったのでcaseを使ったのだが
たしかにcaseにcaseを組み合わせるのは
昔のinit.dでも見たことないかも・・・
ただ自分では最近if文の置き換えでcaseを使ってる
実際に処理が走るなら私もifとかで書くと思うが
今回は変数作成だしなあ・・・
どっかにあるんだっけか
フローチャート的にここはifだとって考えなのかな
分岐構造でexitがあるからダメなのかな・・・
例示されてる範囲だけで考えてみた (スコア:1)
1コめのesacのあとに ;; がないとshellcheckが言ってた。案外重要かも
それはともかく、preのときは二番目の引数で指定させる意味があんまりない感じにみえるので、こんなんなりました
Re:例示されてる範囲だけで考えてみた (スコア:2)
こちらに載せる際に記載が抜けていましたので修正しました
getoptsはmacがいるのでちょっと使いづらいです
また引数にはちょっと制約があるのでこの制約内で作成するとこうなります
# Web閲覧用もVScode入れるかな・・・
Re:例示されてる範囲だけで考えてみた (スコア:1)
getoptsはbashならbuiltinじゃね?
#!/bin/bash なんだよね?
Re:例示されてる範囲だけで考えてみた (スコア:2)
引数とオプションのミックスだとうまく認識しないと思ってましたけど
どちらにしろ引数に制約があるので難しいかなとおもいました
Re:例示されてる範囲だけで考えてみた (スコア:1)
> getoptsはmacがいるので
これ書いてるのもmacOS12なんですが、shell まわりで互換性が問題になるmacOSってまだ生きてるのあるんですかね?
(bashの居場所が /bin/bash なのが、いまでは macOS くらいではという気も?)
本題については、
> # Web閲覧用もVScode入れるかな・・・
なんというか、こちら年寄りなので、ほら書下すたびに中のcaseの最後の ;; 忘れるでしょ、って言う気がしないでもないんですが、いまどきはいろいろよろしくやってくれるんならそれは気にしないのかな
他に気になるところ (スコア:1)
「:$1」のコロンの後に空白が無い
$ENV1と$ENV2を使う意味が無いとか
一つ目の「esac」の後に「;;」が無い
なんでそこを「;」じゃなくて「&&」にするのか
中括弧「{}」が要らないところでも使うのか
中括弧つけるより二重引用符「""」を使う事を検討した方がいいんじゃないか
異常終了の戻り値が0でいいのか
これらに比べれば、caseのネストは、ぜんぜん気にならない
Re:他に気になるところ (スコア:2)
こちらに載せる際に色々抜けていたので実際に近いものに書き直しました
caseのネストは一応レビュー対応者に聞いています
TypescriptやGolangの人なのでcaseのネストがあんまりない環境なので
指摘されたのかもしれません
Re:他に気になるところ (スコア:1)
くらいでいいじゃねーかな
引数の中に「##」を入れられちゃうと困るけどな
引数の文字数を制限できるなら、その心配も消せそうな気がする