web-dev-qa-db-ja.com

caseステートメントを番号範囲と一致させる方法は?

0〜50の範囲の列番号でスイッチケースを実行しています。現在、各ケースは個別の列番号をサポートしており、その失敗を観察しています。

コードは次のとおりです。

    i=10
    a=1
    b=0.65
    if [ "$a" != "$b" ]; then 
       case $i in  
            [1]|[2]|[5]) echo "Not OK"; ;; 
            [9-10]|[12]) echo "may be ok"; ;; 
            *) echo "no clue - $i"; ;; 
       esac
   fi

このコードはmay be okを出力するはずですが、no clue - 10を取得します。

55
shamik

Bash caseは、数値範囲では機能しません。 []はシェルパターン用です。

たとえば、この場合[1-3]5|6)は15または25または35または6で機能します。

コードは次のようになります。

i=10
a=1
b=0.65
if [ "$a" != "$b" ] ; then
   case $i in
        1|2|5) echo "Not OK"; ;;
        9|10|12) echo "may be ok"; ;;
        *) echo "no clue - $i"; ;;
   esac;
fi

irealになる可能性がある場合between 9と10の場合、範囲でif(大文字小文字ではなく)を使用する必要があります。

99
Arnon Zilca

ifおよび[ solution

arg=1
if [ "$arg" -lt 5 ]; then
  echo 'less than 5'
Elif [ "$arg" -lt 15 ]; then
  echo 'less than 15'
Elif [ "$arg" -eq 17 ] || [ "$arg" -eq 19 ]; then
  echo '17 or 19'
else
  echo 'neither'
fi

POSIX 7

https://stackoverflow.com/a/25482040/895245 で述べられているように、BashはPOSIXに従います。

引用は次のとおりです。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 セクション「ケース条件付き構成」:

条件付きコンストラクトケースは、いくつかのパターンの最初のパターンに対応する複合リストを実行します(パターンマッチング表記を参照)[...]同じ複合リストを持つ複数のパターンは、「|」で区切られます。シンボル。 [...]

ケース構成の形式は次のとおりです。

case Word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

そして http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_1 セクション「2.13。パターン一致表記法」は次のように述べています。

[オープンブラケットがXBD REブラケット式のようにブラケット式を導入する場合

拡張正規表現 は、「9.3.5 REブラケット表現」というセクションを指します。

ブラケット式(角括弧で囲まれた式 "[]")は、特定の単一文字セットに一致するREであり、空でないセットに基づいて、特定の複数文字照合要素セットに一致する場合がありますブラケット式に含まれる式をリストします。

したがって、次のような操作を行う場合は、個々の文字のみが考慮されます。

[9-10]