bash 脚本在获取时产生不同的结果

Ale*_*ini 6 bash

你能帮我吗,为什么这个脚本在来源时(甚至直接在控制台上)有效而在脚本上不起作用?

我已经检查过,无论如何我在 /bin/ 中使用相同的 bash,并且始终使用 4.4.19(1)-release(使用 进行检查$BASH_VERSION)。

此外,我尝试删除shebang,但没有任何变化。

#!/bin/bash

fname=c8_m81l_55.fit
bname=${fname%%+(_)+([0-9]).fit}
echo $bname
Run Code Online (Sandbox Code Playgroud)

给出这些结果:

test:~$ ./test.sh
c8_m81l_55.fit
Run Code Online (Sandbox Code Playgroud)
test:~$ . ./test.sh
c8_m81l
Run Code Online (Sandbox Code Playgroud)

ogu*_*ail 6

+(pattern)除非启用 extglobs,否则Bash 无法识别语法,并且默认情况下禁用它们。显然,您的 bash 设置可以在交互式会话中启用它们;这就是为什么您的脚本只有在交互式 shell 中才起作用的原因。

要解决这个问题,请通过以下命令在脚本中启用 extglobs:

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

或者使用不管 shell 的交互性如何工作的替代方法:

bname=$(sed 's/__*[0-9][0-9]*\.fit$//' <<< $fname)
# with GNU sed it'd look like:
bname=$(sed -E 's/_+[0-9]+\.fit$//' <<< $fname)
Run Code Online (Sandbox Code Playgroud)