首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在qsub上使用变量?

如何在qsub上使用变量?
EN

Stack Overflow用户
提问于 2021-05-06 13:33:22
回答 2查看 91关注 0票数 0

我是qsub的新手,我正在尝试找出如何以最佳方式使用任务队列。我有一个运行良好的脚本:

代码语言:javascript
复制
#!bin/bash

##PBS -V  # Export all environment variables from the qsub command environment to the batch job.
#PBS -N run
#PBS -q normal.q 
#PBS -e archivo.err
#PBS -o archivo.out
#PBS -pe mpirun 8
#PBS -d ~/ # Working directory (PBS_O_WORKDIR)
#PBS -l nodes=1:ppn=8    

~/brinicle/step-2/onephase_3/./main.x --mesh ~/brinicle/step-2/onephase_3/results/mesh.msh -Rmin 0 -Rmax 10 -Zmin 0 -Zmax 10 -o 2 -r 2 -T_f -10 -a_l 7.8 -a_s 70.8 -dt 0.01 -t_f 1 -v_s 10 -ode 12 -reltol 0.00001 -abstol 0.00001

正如您所看到的,问题在于命令行过长,并且很难从命令shell中进行编辑。我想把它分成像这样的变量

代码语言:javascript
复制
#MESH="--mesh ~/brinicle/step-2/onephase_3/results/mesh.msh"
#EXE="~/brinicle/step-2/onephase_3/./main.x"
.
.
.
$EXE $MESH $PARAMETERS

对于其他参数也是如此。

但是当我这样做的时候,程序不会运行,并告诉我有一个非法的变量,或者变量是未定义的。此外,对我来说,很重要的一点是要轻松地更改参数-o-r-ode,并一次发送多个作业。例如,使用-o 1时5个作业相等,然后使用-0 2时5个作业相等,以此类推。我希望也能够以这种方式修改-r-ode。问题是,如果不使用变量,我真的不知道该怎么做。

请,如果有人可以告诉我如何以这种方式自动化脚本将是一个巨大的帮助。

EN

回答 2

Stack Overflow用户

发布于 2021-05-06 14:42:03

使用bash数组。

代码语言:javascript
复制
exe=(~/brinicle/step-2/onephase_3/./main.x)
mesh=(--mesh ~/brinicle/step-2/onephase_3/results/mesh.msh)
parms=(
    -Rmin 0
    -Rmax 10
    -Zmin 0
    -Zmax 10
    . etc.
)
"${exe[@]}" "${mesh[@]}" "${parms[@]}"

研究bash数组以及如何在shell中使用then和quoting。更喜欢使用小写变量。shell中展开的研究顺序。

票数 0
EN

Stack Overflow用户

发布于 2021-05-06 15:14:52

如果你有很多静态参数和动态参数,一种替代方案是重构成一个函数,在这个函数中,你硬编码不变的部分,并插入发生变化的部分。

代码语言:javascript
复制
qrunmesh () {
    qsub <<:
#!bin/bash

##PBS -V  # Export all environment variables from the qsub command environment to the batch job.
#PBS -N run
#PBS -q normal.q 
#PBS -e archivo.err
#PBS -o archivo.out
#PBS -pe mpirun 8
#PBS -d ~/ # Working directory (PBS_O_WORKDIR)
#PBS -l nodes=1:ppn=8

"$1" --mesh "$2" -Rmin 0 -Rmax 10 -Zmin 0 -Zmax 10 \
     -o "$3" -r "$4" -T_f -10 -a_l 7.8 -a_s 70.8 \
     -dt 0.01 -t_f 1 -v_s 10 -ode "$5" \
     -reltol 0.00001 -abstol 0.00001
:
}

for o in 1 2 3; do
  for r in 5 10 15; do
    for x in onephase_3 onephase_2 twophase_3; do
      for ode in 12 13 15; do
        for mesh in onephase_3 otherphase_2; do
           qrunmesh "$x" "$mesh" "$o" "$r" "$ode"
        done
      done
    done
  done
done

(我对qsub不是很熟悉;如果不传入脚本名称,我假设它接受标准输入上的脚本。如果没有,您可能需要将here文档存储在一个临时文件中,提交它,然后删除临时文件。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67412388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档