0

我编写了以下脚本:

cat BaseReCall.sh
#!/bin/bash

#### Usage: < input > < ref > < (array of dbsnps) >

input=$1
ref=$2
Pickle=$3

echo "${Pickle[@]}"
### Assign variables
BaseReCall="gatk BaseRecalibrator \\
   -I $input \\
   -R $ref \\
   -O recal_table "
dir=$(dirname $input)
log=${dir}/BaseReCall.out

string=()
## Store array values in string
for i in "${Pickle[@]}";do
  site=$(echo " --known-sites $i")
  string+=$site

done

printf "$BaseReCall${string[@]}\n" #>> $log

这个想法是允许我使用数组输入多个 dbsnp 值作为 Pickle。如果我输入 bash 数组看起来不错。

Pickle=(dbSnp gold_standard_indels)
printf "${Pickle[@]}\n"
dbSnp gold_standard_indels

当我将它输入到我的函数中时,我没有得到两个 dbsnps。只有第一个。

sh BaseRecall.sh input ref "${Pickle[@]}"
dbSnp
gatk BaseRecalibrator \
   -I input \
   -R ref \
   -O recal_table  --known-sites dbSnp

作为健全性检查,我也尝试在脚本之外运行循环。

string=()
## Store array values in string
for i in "${Pickle[@]}";do
>  site=$(echo " --known-sites $i")
>  string+=$site

> done
printf "$BaseReCall${string[@]}\n" #>> $log
gatk BaseRecalibrator    -I     -R     -O recal_table --known-sites dbSnp --known-sites gold_standard_indels

它返回了我一直想要的东西。发生这种情况是因为它被作为位置参数输入吗?有没有办法让我为此 Pickle 参数输入多个值?

4

1 回答 1

1

感谢评论中提出的一些观点,我已经解决了我遇到的问题。我误解了数组并通过更改我的脚本

input=$1
ref=$2
Pickle=$3

input=$1
ref=$2
shift 2
Pickle=("$@")

这似乎现在起作用了。一位评论员还提到了使用declare来获取数组的状态,这也有很大帮助。非常感谢。

于 2021-09-01T19:38:52.617 回答