“ $ {my_array [@] /#/-}”中的/#/-是什么类型的操作?


17

数组转换为命令参数的可接受答案使用以下Bash命令:

command "${my_array[@]/#/-}" "$1"

我正试图弄清楚/#/-零件的作用。不幸的是,我不知道该怎么称呼,所以我很难找到任何文档。我浏览了有关阵列和一些网站的Bash手册页部分,但是找不到任何东西。

Answers:


24

这是图案置换的一个实例壳参数扩展${parameter/pattern/replacement}膨胀${parameter},取代的第一个实例patternreplacement。在这种模式的上下文中,#它是特殊的:它将模式固定在参数的开头。所有这些操作的最终结果是扩展my_array数组中的所有值,并扩展-到每个值之前(通过替换每个参数开头的空模式)。


2

是的,它是shell参数扩展中的模式替换,如下所示:

${parameter/pattern/replacement}

但是,如果第一个字符之后的第一个字符//#或,%则它具有all(重复)start和的特殊含义end

与:

$ str='one_#two_two_three_one'

单个/将替换第一个实例。的第一个实例one

$ echo "${str/one/x-x}"
x-x_#two_two_three_one

或者第一个实例two

$ echo "${str/two/x-x}"
one_#x-x_two_three_one

最后的实例one

$ echo "${str/%one/x-x}"
one_#two_two_three_x-x

所有重复two

$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one

开始时的实例one

$ echo "${str/#one/x-x}"
x-x_#two_two_three_one

#(引号#)开头的字符串:

$ echo "${str/\#two/x-x}"
one_x-x_two_three_one

但是,如果您仅保留#(不带引号),则替换将在变量的开头设置:

$ echo "${str/#/====}"
====one_#two_two_three_one

此外,如果参数是数组,则对所有元素进行替换:

$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three

措辞有点误导,因为#%是模式的一部分,而//运算符不同于/并使用相同的模式。您可以拥有pattern='#x'; echo "${var/$pattern}"(或${var//$pattern}),但与pattern=/x; echo "${var/$pattern}"有所不同echo "${var//x}"。请注意,#%可以组合zsh,但不能bash也不ksh
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.