我有一个bash脚本,它用几个变量调用qsub
:
group=group_1
normals=$(IFS=,; echo *.txt)
qsub -v VAR1=$group,VAR2=${normals[@]} [...] run_script.pbs
run_script.pbs
#PBS -l nodes=1:ppn=16
#PBS -l walltime=2:00:00
#PBS -l mem=10GB
group=$VAR1
normals=$VAR2
echo ${normals[@]}
在这种情况下,数组normals
包含多个文件名,但是当我尝试在.pbs脚本中访问它们时,只打印第一个文件名。
在.pbs脚本中传递和访问数组的正确方法是什么?
答案 0 :(得分:3)
你不将文件列表存储在一个数组中。您只是在执行命令替换语法$(..)
并将输出存储在变量的上下文中并尝试将其作为数组访问。
获取文件列表(不需要$(..)
)并将其存储在数组中的正确方法是,
shopt -s nullglob
fileList=(*.txt)
oldIFS="$IFS"
IFS=,
printf -v var_list "%s" "${fileList[*]}"
IFS="$oldIFS"
shopt -u nullglob
当nullglob
没有返回当前文件夹中的任何文件时,需要*.txt
选项来处理这种情况。不包括会在控制台上吐出一些错误。当我们不再需要设置选项时,我们会使用-u
取消设置。
使用-v
支持的printf
选项,您可以将数组输出以逗号分隔格式直接存储到变量var_list
现在,您可以将包含逗号分隔格式的文件列表的$var_list
传递给您想要的命令。
qsub -v VAR1=$group,VAR2="${var_list}"