私は次のコードを使用しました
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)。
後で追加されたので、およびksh93
Solaris 11以降のバージョンでも使用できますが、いくつかのバリエーションがあります(演算子はおよび/ビルドでも機能します)。 ksh88は90年代以降に更新されていません(一部のシステムのバグ修正やPOSIX一貫性修正を除く)。/bin/sh
/bin/ksh
zsh
=~
test
[
zsh
yash
ここでは正規表現は必要なく、ワイルドカードパターンも機能します。
[[ $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"]))}'