Bash-模式匹配-Don';不能在脚本中替换

Bash-模式匹配-Don';不能在脚本中替换,bash,Bash,我在bash脚本中有一个要替换的模式,如果我直接在终端中运行,它将正确替换。但是如果我把完全相同的代码放在脚本中,它就不起作用了 例如: test="1[[ 23 ]]4" && echo "${test//[[][[]*( )23*( )[]][]]/56}" 如果我在终端中运行,上面的命令输出1564,但是如果我在脚本中运行,它输出1[[23]]4(我只是创建一个空脚本,放置一个bash shebang,粘贴上面的代码,添加执行权限并

我在bash脚本中有一个要替换的模式,如果我直接在终端中运行,它将正确替换。但是如果我把完全相同的代码放在脚本中,它就不起作用了

例如:

test="1[[ 23 ]]4" && echo "${test//[[][[]*( )23*( )[]][]]/56}"
如果我在终端中运行,上面的命令输出
1564
,但是如果我在脚本中运行,它输出
1[[23]]4
(我只是创建一个空脚本,放置一个bash shebang,粘贴上面的代码,添加执行权限并运行;我尝试使用
/test.sh
bash./test.sh
运行,以确保bash是使用的shell,但结果仍然相同)

如果我将代码更改为:

test="1[[ 23 ]]4" && echo "${test//[[][[] 23 []][]]/56}"
但是我想要0个或更多的空格,所以第一个是正确的选择,但由于某些原因,它在脚本中不起作用


我认为这可能与glob扩展在终端和脚本中的工作方式不同有关,但我不知道如何继续。我阅读了,但仍然没有任何线索。

您需要在脚本中打开bash的扩展globbing(我认为它会在交互会话中自动打开,或者在您的
~/.profile
中自动打开)为了使
*()
结构正常工作:

#!/usr/bin/env bash
shopt -s extglob
test="1[[ 23 ]]4" && echo "${test//[[][[]*( )23*( )[]][]]/56}"

谢谢,它成功了!有趣的是,我怀疑它是关于glob扩展的,并尝试了
shopt-s nullglob
(我认为这将取消所有glob扩展)和
shopt-s globstar
,但没有尝试
shopt-s extglob