您能帮助我吗,为什么这个脚本在源代码(甚至直接在控制台上)时有效,而在脚本上不起作用?
我已经检查过,无论如何我在 /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)
语法,除非启用了 extglob,并且默认情况下它们是禁用的。显然,您的 bash 设置使它们能够进行交互式会话;这就是为什么您的脚本仅在交互式 shell 中运行时才有效。
要解决此问题,请通过以下命令在脚本中启用 extglob:
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)