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

标签 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
给出这些结果:
test:~$ ./test.sh
c8_m81l_55.fit
test:~$ . ./test.sh
c8_m81l

最佳答案

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

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

shopt -s extglob

或者使用不管 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)

关于bash 脚本在获取时产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61135749/

相关文章:

bash - 如何欺骗应用程序认为它的标准输出是终端,而不是管道

bash - OpenSSL 解密 AES 256 位(base64)加密密码 - 错误的最终 block 长度

arrays - 在 bash 中更改数组值的正确模式

linux - bash : expression recursion level exceeded (error token is . ..)

linux - 如何使用bash打开多个 screen 并让它们独立运行

bash - 如何使用 Expect 从 URL 运行文件?

linux - 如何找出谁在调用 apt-get?

bash - 如何找到最大的元素并将其存储在数组中

c - 如何在 Makefile 中复制文件并创建目录?

bash:将脚本的输出作为脚本执行