接受的答案将数组转换为命令的参数?使用以下 Bash 命令:
command "${my_array[@]/#/-}" "$1"
我正试图弄清楚这个/#/-
部分到底是做什么的。不幸的是,我不知道该怎么称呼它,所以我很难找到任何文档。我浏览了 Bash 手册页中有关数组和一些网站的部分,但找不到任何内容。
答案1
这是模式替换的一个例子shell参数扩展:${parameter/pattern/replacement}
扩展,用替换${parameter}
第一个实例。在这种模式的上下文中,是特殊的:它将模式锚定到参数的开头。所有这一切的最终结果是扩展数组中的所有值,并将其添加到每个值之前(通过替换每个参数开头的空模式)。pattern
replacement
#
my_array
-
答案2
是的,这是一个模式替换shell参数扩展作为:
${parameter/pattern/replacement}
但是,如果第一个字符之后的第一个字符/
是 or/
或#
,则它具有(重复)和%
的特殊含义。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