将数组作为bash变量传递

时间:2018-08-01 07:29:38

标签: bash

我正在用bash脚本提交一系列批处理作业。

批处理脚本(script.sh)如下:

samtools merge $1 $2

$1是输出,并且只有一个文件。因此,这没问题。

$2是输入,但不仅是一个文件,而且是几个文件,并且在每个目录中都不同。 bash脚本如下:

for i in directory1 directory2 
do
cd $i
d=$(echo *specific_prefix.txt)
echo $d
sbatch script.sh ${i}.output $d
cd ..
done

以上述方式运行,批处理脚本仅将$d的第一个元素作为其变量。 bash变量($2)是否可以采用不同数量的变量,例如,它是一个列表,其长度可以在另一个变量中确定?

编辑:

我的抽签作业脚本(merge.sh)为:

#!/bin/bash -l

arg1="$1"
shift 1
arg2=("$@")

samtools merge arg1 arg2

然后我使用bash脚本运行它:

#!/bin/bash -l

for i in directory
do
cd $i
d=$(echo *RG.sort.dedup.bam)
sbatch merge.sh ${i}.output $d
cd ..
done 

错误是:samtools merge: fail to open "arg2": No such file or directory

脚本中可能有什么错误?谢谢!

1 个答案:

答案 0 :(得分:2)

您可以在存储固定参数之后使用shift命令,并使用$@如下脚本。您可以使用Shell数组存储从第3个位置开始的可变数量的参数。

# store first 2 arguments in variables
arg1="$1"
arg2="$2"

# using shift 2 discard first 2 arguments
shift 2

# now store all remaining arguments in an array
arg3=("$@")

# examine our variables
declare -p arg1 arg2 arg3

现在将其运行为:

./script.sh merge abc foo bar baz
declare -- arg1="merge"
declare -- arg2="abc"
declare -a arg3='([0]="foo" [1]="bar" [2]="baz")'