在 .sh 脚本中将参数传递给注释

在 .sh 脚本中将参数传递给注释

我是使用 .sh 脚本的初学者,所以请原谅我的无知。这是我的问题:

要将我的作业提交到我们的集群,相应的提交文件必须包含一个“slurm header”,看起来像这样。

#!/bin/sh 
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla
#
########### End Slurm header ##########

# Load module
module load math/matlab/R2020a

# Start a Matlab program
matlab -nodesktop -r "program $1 $2"

exit

请注意,我将两个参数传递给该 .sh 文件,然后将其传递给 matlab 程序。如何根据输入参数使 Slurm 标头中的作业名称动态化?

简单地写出#SBATCH --job-name=blabla$1$2可预测的内容是行不通的。

答案1

编写如下所示的 sbatch 作业脚本,其中仅包含您要在作业中运行的命令:

#!/bin/sh 

# you can include #SBATCH comments here if you like, but any that are
# specified on the command line or in SBATCH_* environment variables
# will override whatever is defined in the comments.  You **can't**
# use positional parameters like $1 or $2 in a comment - they won't
# do anything.

# Load module
module load math/matlab/R2020a

# Start a Matlab program
# give it five arguments, -nodesktop, -r, program, and two
# more that you pass in as arguments to THIS script.
matlab -nodesktop -r "program" "$1" "$2"

# alternatively (since I don't know how matlab runs "program",
# or how it handles args or how it passes them on to a matlab
# script), maybe just three args:
# matlab -nodesktop -r "program $1 $2"

exit

将其保存为您喜欢的任何内容 - 例如./mymatlabjob.sh- 并使其可执行chmod +x mymatlabjob.sh

然后在命令行上运行它:

sbatch --job-name "whatever job name you want" ./mymatlabjob.sh arg1 arg2

其中arg1arg2是您想要传递给 matlab 作业的参数。

或者在像这样的嵌套循环中:

#!/bin/sh

for i in 1 2 3; do
  for j in 3 2 1; do
    sbatch --job-name "blablah$i$j" ./mymatlabjob.sh "$i" "$j"
  done
done

运行该命令将使用 sbatch 运行 9 个不同的作业,每个作业都有不同的作业名称 - $i 和 $j 的每次迭代都有一个作业名称。

答案2

我认为你不能。所有以 开头的行#都会被 shell 忽略,并且$1$2是 shell 的东西。许多作业管理器(包括 slurm)都有一些以 shell 注释形式编写的命令,因此会被 shell 忽略,但会被作业管理器读取。这就是你的SBATCH线路:

#SBATCH --job-name=blabla

因此无法在同一个脚本中动态地执行此操作。但是,您可以创建一个包装脚本来执行此操作。例如:

#!/bin/sh
cat <<EoF
#!/bin/sh 
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blabla$1$2
#
########### End Slurm header ##########

# Load module
module load math/matlab/R2020a

# Start a Matlab program
matlab -nodesktop -r "program $1 $2"

exit
EoF

如果您现在使用两个参数运行此脚本,它将打印出您真正想要的脚本:

$ foo.sh param1 param2
#!/bin/sh 
#
########## Begin Slurm header ##########
#
#SBATCH --job-name=blablaparam1param2
#
########### End Slurm header ##########

# Load module
module load math/matlab/R2020a

# Start a Matlab program
matlab -nodesktop -r "program param1 param2"

exit

所以你可以这样做:

foo.sh param1 param2 > slurm_script.sh

相关内容