将数组转换为命令的参数?

将数组转换为命令的参数?

我有一个命令的“选项”数组。

my_array=(option1 option2 option3)

我想在 bash 脚本中调用此命令,使用数组中的值作为选项。所以,command $(some magic here with my_array) "$1"变成:

command -option1 -option2 -option3 "$1"

我该怎么做?是否可以?

答案1

我更喜欢一种简单的bash方式:

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

原因之一是空间。例如,如果您有:

my_array=(option1 'option2 with space' option3)

基于的解决方案sed会将其转换为-option1 -option2 -with -space -option3(长度5),但上述bash扩展会将其转换为-option1 -option2 with space -option3(长度仍然为3)。很少,但有时这很重要,例如:

bash-4.2$ my_array=('Ffoo bar' 'vOFS=fiz baz')
bash-4.2$ echo 'one foo bar two foo bar three foo bar four' | awk "${my_array[@]/#/-}" '{print$2,$3}'
 two fiz baz three

答案2

我会在 bash 中使用临时数组来做这样的事情:

ARR=("option1" "option2" "option3"); ARR2=()
for str in "${ARR[@]}"; do 
   ARR2+=( -"$str" )
done

然后在命令行中:

command "${ARR2[@]}"

答案3

我没有处理它是在一个数组中,而是在考虑在字符串中以空格分隔。这个解决方案可以解决这个问题,但考虑到它是一个数组,请使用 manatwork 的解决方案 ( @{my_array[@]/#/-})。


sed有了子外壳,这还不错。正则表达式的简单程度取决于您对选项的保证。如果选项都是一个“单词”(a-zA-Z0-9仅),那么一个简单的起始单词边界(\<)就足够了:

command $(echo $my_array | sed 's/\</-/g') "$1"

如果您的选项有其他字符(很可能-),您将需要更复杂的东西:

command $(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g') "$1"

^匹配行的开头,[ \t]匹配空格或制表符,\|匹配任一侧(^[ \t]),\( \)分组(对于\|)并存储结果,\<匹配单词的开头。 \1通过保留括号 ( \(\)) 中的第一个匹配项开始替换,-当然还添加我们需要的破折号。

这些适用于 gnu sed,如果它们不适用于您的,请告诉我。

如果您要多次使用同一个东西,您可能只想计算一次并存储它:

opts="$(echo $my_array | sed 's/\(^\|[ \t]\)\</\1-/g')"
...
command $opts "$1"
command $opts "$2"

答案4

[srikanth@myhost ~]$ sh sample.sh 

-option1 -option2 -option3

[srikanth@myhost ~]$ cat sample.sh

#!/bin/bash

my_array=(option1 option2 option3)

echo ${my_array[@]} | sed 's/\</-/g'

相关内容