考虑以下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 的范围限制是什么?和其他选择?