我正在用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
脚本中可能有什么错误?谢谢!
答案 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")'