2013-07-25 54 views
0

我正在使用BASH 3.2。我可以執行的命令行:BASH:模式匹配不起作用

$ build_number=23332 
$ if [[ $build_number != +([0-9]) ]] 
> then 
> echo "Bad Build Number ($build_number). No CPU time for you!" 
> else 
> echo "Build Number ($build_number) is numeric" 
> fi 
Build Number (2332) is numeric" 

如果我改變build_number to 23332a`,這將返回:

Bad Build Number (23332a). No CPU time for you! 

現在,我會盡力把這個變成我的shell腳本:

#! /bin/bash 
... 
# 
# Set options 
# 
while getopts :hu:j:b:p: option 
do 
    case $option in 
     p) promotion_name="$OPTARG";; 
     u) jenkins_url="$OPTARG";; 
     j) job_name="$OPTARG";; 
     b) build_number="$OPTARG" 
      if [[ $build_number != +([0-9]) ]] 
      then 
       error "Build Number must be numeric" 
      fi 
     ;; 
     h) printf "\n$USAGE\n" 
      exit 0;; 
     *) error "Invalid Argument";; 
    esac 
done 
shift $(($OPTIND - 1)) 

當我嘗試執行我的計劃,我得到以下錯誤:

$ ./promotion.sh -b 238d -jasdad 
./promotion.sh: line 55: syntax error in conditional expression: unexpected token `(' 
./promotion.sh: line 55: syntax error near `+([' 
./promotion.sh: line 55: `  if [[ $build_number != +([0-9]) ]]' 

那麼,我做錯了什麼?

回答

2

您需要啓用擴展通配符:

shopt -s extglob 
+0

我的默認交互式外殼是Kornshell,我第一次測試它,它工作正常。然後,意識到我應該在BASH中運行它,我啓動了一個BASH shell並且它仍然有效。然而,作爲一個Kornshell人員,我在''.bashrc'文件中設置了shell選項'extglob'和'lithist'。這就是爲什麼它在命令行上工作,而不是在我的shell腳本中。 –

0

以及最明顯的一點是,加上檢查是否ceeding前字符匹配的模式,在這裏你有沒有ceeding預字把加後它

+0

這在技術上是正確的,因爲擴展模式(不帶'shopt -s extglob')被解釋爲語法不正確的正則表達式。然而,鑑於他的斷言,它在他的交互式shell中正常工作,我們可以假定擴展的glob是有意的。 – chepner