Solarisで正規表現と比較すると、=~演算子が構文エラーを生成するのはなぜですか?

Solarisで正規表現と比較すると、=~演算子が構文エラーを生成するのはなぜですか?

私は次のコードを使用しました

appcount_range="^[1-$APP_COUNT]$"
    until [[ $APP_OPTION =~ $appcount_range ]]
    do
            echo "INVALID CHOICE! Please enter a valid option:"
            read APP_OPTION
    done

メニューオプションが正しく入力されていることを確認してください。 APP_COUNTは動的に決定されるため、有効なオプションをハードコードすることはできません。このコードは ksh93 を使用する Linux ベースのサーバーで完全に実行されますが、ksh88 を使用する Solaris サーバーでは同じコードで構文エラーが発生します。

syntax error at line ## : '=~' unexpected

ksh88に=~認識された演算子がないのはなぜですか?正規表現を比較する代わりに何を使うべきですか?

答え1

/bin/kshこれはksh88(およびSolaris 10以前)のエラー出力です/usr/xpg4/bin/sh

[[ ... ]]構文はkshから来ていますが、内部=~は実際のbashismのほぼ1つです。bash実際にこれを導入したシェルです(バージョン3.0)。

後で追加されたので、およびksh93Solaris 11以降のバージョンでも使用できますが、いくつかのバリエーションがあります(演算子はおよび/ビルドでも機能します)。 ksh88は90年代以降に更新されていません(一部のシステムのバグ修正やPOSIX一貫性修正を除く)。/bin/sh/bin/kshzsh=~test[zshyash

ここでは正規表現は必要なく、ワイルドカードパターンも機能します。

[[ $APP_OPTION = [1-$APP_COUNT] ]]

kshの演算子の場合、=右側のオペランドはワイルドカードパターンです。あるいは、パターンマッチングのために標準的な方法を使用することができる。

case $APP_OPTION in
  [1-$APP_COUNT]) ...
esac

9より大きい値では機能しません。 2と1(および一部のロケールのように並べ替えられた他の文字)でのみ一致するのと[1-12]同じです。[21-1]1

kshワイルドカードパターンは機能的に拡張正規表現と同じですが({x,y}最新のバリエーションのEREインターバル演算子を除く)、構文は異なります。

  • .->?
  • .*->*
  • x*->*(x)
  • x|y->@(x|y)
  • x?->?(x)
  • x+->+(x)
  • [^x]->[!x]
  • x{3,5}-> xxx?(x)?(x)(ksh93にはあり、{3,5}(x)ksh88にはありません)。

それでも正規表現を使用する必要がある場合は、別のユーティリティを使用する必要があります。

expr "x$string" : "x$regexp" # BRE, anchored at the start

STRING=$string RE=$regexp command -p awk '
  BEGIN{exit(!(ENVIRON["STRING"] ~ ENVIRON["RE"]))}'

関連情報