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