Bash - 从数组传递参数

时间:2017-06-20 12:08:17

标签: bash

我使用bash来调用用java(gatk)编写的工具,我需要从数组中传递多个参数作为输入参数。我试过这种方式,但似乎没有用。你能帮帮我,怎么解决?

代码:

java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    for foo in array
    do
        --variant  $foo \
    done

我想要被称为:

java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    for foo in array
    do
        --variant  file1 \
        --variant  file2 \
        --variant  file3 ...etc
    done

编辑:对不起误解

array=("file1","file2","file3"...)

由于

4 个答案:

答案 0 :(得分:5)

我认为你真正想要的是如果array包含a b c,那么拥有命令

java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    --variant a --variant b --variant c

如果是这样,您可以准备第二个阵列:

array=("file 1" "file 2" "file 3")
declare -a fullarray
for i in "${array[@]}"
do
    fullarray+=( --variant "$i" )
done

然后

java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    "${fullarray[@]}"

这也将确保如果array中的任何名称包含空格,它仍将作为正确的参数传递,而不是分成两个(假设你没有弄乱它)当你将它添加到array)时。

答案 1 :(得分:0)

使用echo和$():

array=(file1 file2 file3)
java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    $(for foo in ${array[*]}
    do
        echo -n " --variant  $foo"
    done)

答案 2 :(得分:0)

您可以使用以下方法执行此操作:

java $GATK \
    -T GenotypeGVCFs  \
    -R $ref \
    -o output.vcf \
    ${array[*]/#/ --variant }

答案 3 :(得分:0)

@ RealSkeptic的答案是最好的。我写了,为了便于阅读:

array=( "file 1" "file 2" "file 3" )
args=(
    "$GATK"
    -T GenotypeGVCFs 
    -R "$ref"
    -o output.vcf
)
for foo in "${array[@]}"; do args+=( --variant "$foo" ); done

java "${args[@]}"