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
を取得します。
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
i
がreal
になる可能性がある場合between 9と10の場合、範囲でif
(大文字小文字ではなく)を使用する必要があります。
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]