2013-07-25 55 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