変数値の一致とデフォルト値の設定

変数値の一致とデフォルト値の設定

どの値でも使用できる変数があります"SUBSCRIPT""ITERATE""COUNTER"

これらのいずれかで変数をテストし、"SUBSCRIPT"一致しない場合にデフォルト値に設定するにはどうすればよいですか?

コンパクトな形が欲しかったし、次のように思い出した。

  [[ "${signal}" == "SUBSCRIPT" || "${signal}" == "ITERATE" ||
     "${signal}" == "COUNTER" ]] || signal="SUBSCRIPT"

前述の作業は失敗しますか?

ベストアンサー1

あなたのコードは働く、同じ種類のタスクを書くためのいくつかのきちんとした方法があります。

最初の方法はすべてのPOSIXシェルで動作し、標準caseステートメントを使用します。

case $signal in
    SUBSCRIPT|ITERATE|COUNTER)
        # do nothing
        ;;
    *)
        signal=SUBSCRIPT
esac

このステートメントは、3つの値のうちの1つがすでに存在する場合を除き、case変数の値を文字列に設定します。SUBSCRIPTSUBSCRIPTITERATECOUNTER

次のように1行に書き込むことができます。

case $signal in (SUBSCRIPT|ITERATE|COUNTER) ;; (*) signal=SUBSCRIPT; esac

if以下では、より簡潔なステートメントを使用することもできますbash

if [[ $signal != @(SUBSCRIPT|ITERATE|COUNTER) ]]; then
    signal=SUBSCRIPT
fi

または、該当する場合は段落評価を使用します。

[[ $signal == @(SUBSCRIPT|ITERATE|COUNTER) ]] || signal=SUBSCRIPT

これは、拡張されたグローブパターンを使用して、変数の値が上記の3つの値のいずれかに一致するかどうかをテストします(構文はシェルから継承されますksh)。その場合いいえmatch(テストはコードの最初のバリエーションとは反対です。2番目のバリアントで||使用されます)、変数の値は文字列にリセットされますSUBSCRIPT

おすすめ記事