BASH:模式匹配不起作用
我使用的是bash3.2。我可以从命令行执行以下操作:BASH:模式匹配不起作用,bash,pattern-matching,Bash,Pattern Matching,我使用的是bash3.2。我可以从命令行执行以下操作: $ 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 (233
$ 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\u number更改为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]) ]]'
那么,我做错了什么?您需要启用扩展全局绑定:
shopt -s extglob
最明显的是,加号检查前置字符是否与模式匹配,这里没有前置字符将加号放在它后面这在技术上是正确的,因为扩展模式(不带shopt-s extglob
)被解释为语法不正确的正则表达式。然而,考虑到他的断言,它在他的交互式shell中工作正常,我们可以假设扩展的glob是预期的。我的默认交互式shell是Kornshell,我第一次在那里测试它,它工作得很好。然后,意识到我应该在BASH中运行它,我启动了一个BASH shell,它仍然有效。然而,作为一个Kornshell人,我在.bashrc
文件中设置了shell选项extglob
和lithist
。这就是为什么它在命令行上工作,而不是在我的shell脚本中工作。