배열을 명령 인수로 변환하시겠습니까?

배열을 명령 인수로 변환하시겠습니까?

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

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]) 일치, \( \)그룹화(for \|) 및 결과 저장, \<단어 시작 일치. 대괄호( ) 안의 첫 번째 항목을 \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'

関連情報