有一个脚本:
#!/bin/bash
s='1 2, 3 4,'
s0="$(echo ${s//,/ }|tr -s ' ')"
echo "s0: $s0"
d="'${s0//+([[:space:]])/"' '"}'"
echo "d: $d"当我运行这个脚本时,输出是:
$ ./test.sh
s0: 1 2 3 4
d: '1 2 3 4'当我在bash提示符中一个接一个地运行命令时,正确地显示$d变量:
$ s='1 2, 3 4,'
$ s0="$(echo ${s//,/ }|tr -s ' ')"
$ echo "s0: $s0"
s0: 1 2 3 4
$ d="'${s0//+([[:space:]])/"' '"}'"
$ echo "d: $d"
d: '1' '2' '3' '4'
$命令在bash中运行:
$ type bash
bash is /bin/bash
$ echo $0
-bash为什么脚本运行期间的$d设置为'1 2 3 4'而不是预期的'1' '2' '3' '4'?
发布于 2022-08-30 18:27:26
默认情况下,在Bash中没有启用像+(...)这样的扩展全局,您需要在脚本中显式地使用shopt -s extglob来启用它们。
您的交互式shell可能启用了extglob (在某些启动文件中),因此,在命令行上尝试替换命令时,替换命令可以正常工作。但是在脚本中,大多数启动文件不被读取,extglob被禁用,加号和括号作为文字字符。在这两种情况下,字符类的工作方式都是相同的,因此,在关闭+( )时,类似于extglob的类将匹配模式。
在这里,模式与任何东西都不匹配,没有替代的地方,d中唯一的变化就是在${s0//...}扩展中添加的单引号。
https://unix.stackexchange.com/questions/715515
复制相似问题