【问题标题】:Send array to pbs script将数组发送到 pbs 脚本
【发布时间】:2017-09-13 11:17:04
【问题描述】:

我有一个 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 脚本中传递和访问数组的正确方法是什么?

【问题讨论】:

  • @Inian - 完全正确
  • 这个答案有帮助吗?如果它解决了您的问题,请不要忘记将答案标记为已接受

标签: bash pbs


【解决方案1】:

将文件列表存储在数组中。您只是在执行命令替换语法$(..) 并将输出存储在变量的上下文中并尝试将其作为数组访问。

获取文件列表(不需要$(..))并将其存储在数组中的正确方法是,

shopt -s nullglob
fileList=(*.txt)

oldIFS="$IFS"
IFS=,
printf -v var_list "%s" "${fileList[*]}"
IFS="$oldIFS"
shopt -u nullglob

nullglob 选项用于处理*.txt 未返回当前文件夹中的任何文件的情况。不包括会在控制台上吐出一些错误。当我们不再需要该选项集时,我们使用 -u 取消设置它。

使用printf支持的-v选项,您可以将逗号分隔格式的数组输出直接存储到变量var_list

现在您可以将包含逗号分隔格式文件列表的$var_list 传递给您想要的命令。

qsub -v VAR1=$group,VAR2="${var_list}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多