Linux

為什麼 =~ 運算符在 Solaris 上與正則表達式比較時會出現語法錯誤

  • June 18, 2018

我使用了以下這段程式碼

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/kshSolaris 10 和更早版本的,and /usr/xpg4/bin/sh)會輸出的錯誤。

雖然[[ ... ]]語法確實來自 ksh,但=~inside 是為數不多的實際 bashism 之一。bash實際上是引入它的外殼(在 3.0 版中)。

它後來被添加到ksh93​​(與/bin/shSolaris /bin/ksh11 和更高版本的 and 一起使用)和zsh,以及變體(=~運算符也可以在 and 的/ testbuilin[中使用)。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"]))}'

引用自:https://unix.stackexchange.com/questions/450403