命令行上的 Shell 参数扩展在 bash 脚本中不起作用

命令行上的 Shell 参数扩展在 bash 脚本中不起作用

考虑以下GNU shell 参数扩展在 bash 命令行上,即在这里解释:

$ a='hello world    example'

$ echo ${a//+( )/_}
hello_world_example

然而,同样的参数扩展在 bash 脚本中不再起作用。

# !/usr/bin/env bash
a='hello world    example'
echo "${a//+( )/_}"

结果是未改变的字符串:

hello world    example

我确实已经从更简单的参数扩展中了解到命令" "后面echo需要双引号,尽管我不知道为什么。

但是,要使这个特定的参数扩展在 bash 脚本中工作,还需要做什么?为什么?

答案1

+(...)是其一部分扩展的全局,您需要使用 显式启用它们shopt -s extglob

如果它在您的交互式 shell 中工作,您可能shopt -s extglob在 shell 的启动文件之一中拥有它,例如bashrc.但是常规的非交互式 shell 不会读取这些内容,因此其中的任何设置都不会生效,您需要将其显式地放入脚本中。最好在自己的一行中,因为它如何改变解析器的工作方式存在一些怪癖,请参阅: 设置 shopt extglob 的范围限制是什么?和其他选择?

相关内容