Linux
為什麼 =~ 運算符在 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 中沒有公認的操作員,我應該使用什麼作為比較正則表達式的替代方法?
這是 ksh88(
/bin/ksh
Solaris 10 和更早版本的,and/usr/xpg4/bin/sh
)會輸出的錯誤。雖然
[[ ... ]]
語法確實來自 ksh,但=~
inside 是為數不多的實際 bashism 之一。bash
實際上是引入它的外殼(在 3.0 版中)。它後來被添加到
ksh93
(與/bin/sh
Solaris/bin/ksh
11 和更高版本的 and 一起使用)和zsh
,以及變體(=~
運算符也可以在 and 的/test
builin[
中使用)。ksh88 自 90 年代以來一直沒有更新(除了錯誤修復或某些系統上的 POSIX 一致性修復)。zsh``yash
在這裡,您不需要正則表達式,萬用字元模式也可以:
[[ $APP_OPTION = [1-$APP_COUNT] ]]
對於
=
運算符(來自 ksh),右手操作數是萬用字元模式。或者您可以使用標準方式進行模式匹配:case $APP_OPTION in [1-$APP_COUNT]) ... esac
請注意,它不適用於任何大於 9. 的值
[1-12]
,[21-1]
僅與 2 和 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"]))}'