我有一个命令的“选项”数组。
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'