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

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

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

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

我正试图弄清楚这个/#/-部分到底是做什么的。不幸的是,我不知道该怎么称呼它,所以我很难找到任何文档。我浏览了 Bash 手册页中有关数组和一些网站的部分,但找不到任何内容。

答案1

这是模式替换的一个例子shell参数扩展:${parameter/pattern/replacement}扩展,用替换${parameter}第一个实例。在这种模式的上下文中,是特殊的:它将模式锚定到参数的开头。所有这一切的最终结果是扩展数组中的所有值,并将其添加到每个值之前(通过替换每个参数开头的空模式)。patternreplacement#my_array-

答案2

是的,这是一个模式替换shell参数扩展作为:

${parameter/pattern/replacement}

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

和:

$ 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

相关内容