パスワードを忘れた? アカウント作成
15789837 journal
日記

kawakazuの日記: シェルスクリプトのcaseコマンドについて 8

日記 by kawakazu

以下のようなシェルスクリプトで
caseを入れ子で使ったらなんか嫌だと言われた


#!/bin/bash
:$1 $2
ENV1=$1
ENV2=$2

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



#!/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があるからダメなのかな・・・

この議論は、kawakazu (45966)によって「 ログインユーザだけ」として作成されている。 ログインしてから来てね。
  • 1コめのesacのあとに ;; がないとshellcheckが言ってた。案外重要かも

    それはともかく、preのときは二番目の引数で指定させる意味があんまりない感じにみえるので、こんなんなりました

    #!/bin/bash
     
    while getopts d:pu OPT
    do
      case ${OPT} in
        d) TENANT_NAME="dev_${OPTARG}" ;;
        p) TENANT_NAME="pre_stg" ;;
        u) TENANT_NAME="pre_ut" ;;
      esac
    done
    [[ "${TENANT_NAME+set}" == "" ]] && echo "Not Support." &&  exit 1;

  • by Ryo.F (3896) on 2022年09月14日 21時20分 (#4326376) 日記

    「:$1」のコロンの後に空白が無い
    $ENV1と$ENV2を使う意味が無いとか
    一つ目の「esac」の後に「;;」が無い
    なんでそこを「;」じゃなくて「&&」にするのか
    中括弧「{}」が要らないところでも使うのか
    中括弧つけるより二重引用符「""」を使う事を検討した方がいいんじゃないか
    異常終了の戻り値が0でいいのか

    これらに比べれば、caseのネストは、ぜんぜん気にならない

    • ご指摘ありがとうございました

      こちらに載せる際に色々抜けていたので実際に近いものに書き直しました

      caseのネストは一応レビュー対応者に聞いています
      TypescriptやGolangの人なのでcaseのネストがあんまりない環境なので
      指摘されたのかもしれません
      親コメント
      • by Ryo.F (3896) on 2022年09月15日 22時26分 (#4327087) 日記

        case "$1##$2" in
            "dev##*" )   TENANT_NAME="dev_$2" ;;
            "pre##stg" ) TENANT_NAME="pre_stg" ;;
            "pre##ut*" ) TENANT_NAME="pre_ut" ;;
            *)
                echo "Not support"
                exit 0
                ;;
        esac

        くらいでいいじゃねーかな
        引数の中に「##」を入れられちゃうと困るけどな
        引数の文字数を制限できるなら、その心配も消せそうな気がする

        親コメント
typodupeerror

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

読み込み中...