首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash脚本产生的输出与在bash提示符中运行的命令不同。

bash脚本产生的输出与在bash提示符中运行的命令不同。
EN

Unix & Linux用户
提问于 2022-08-30 18:07:37
回答 1查看 801关注 0票数 6

有一个脚本:

代码语言:javascript
复制
#!/bin/bash

s='1 2,   3   4,'
s0="$(echo ${s//,/ }|tr -s ' ')"
echo "s0: $s0"
d="'${s0//+([[:space:]])/"' '"}'"
echo "d: $d"

当我运行这个脚本时,输出是:

代码语言:javascript
复制
$ ./test.sh
s0: 1 2 3 4
d: '1 2 3 4'

当我在bash提示符中一个接一个地运行命令时,正确地显示$d变量:

代码语言:javascript
复制
$ 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中运行:

代码语言:javascript
复制
$ type bash
bash is /bin/bash
$ echo $0
-bash

为什么脚本运行期间的$d设置为'1 2 3 4'而不是预期的'1' '2' '3' '4'

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-08-30 18:27:26

默认情况下,在Bash中没有启用像+(...)这样的扩展全局,您需要在脚本中显式地使用shopt -s extglob来启用它们。

您的交互式shell可能启用了extglob (在某些启动文件中),因此,在命令行上尝试替换命令时,替换命令可以正常工作。但是在脚本中,大多数启动文件不被读取,extglob被禁用,加号和括号作为文字字符。在这两种情况下,字符类的工作方式都是相同的,因此,在关闭+( )时,类似于extglob的类将匹配模式。

在这里,模式与任何东西都不匹配,没有替代的地方,d中唯一的变化就是在${s0//...}扩展中添加的单引号。

票数 14
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/715515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档