理解在sbatch——wrap语句中使用反引号的内部变量替换



我在运行SLURM 20.02.4的CentOS 8.1集群上工作。我试图了解如何在sbatch --wrap=命令中解引用变量。我怀疑我可能已经达到了--wrap命令的极限了。

$ X=2 
$ sbatch --wrap="for((i=0; i<3; i++)); do TMP="echo ${X} $i"; echo ${TMP}; done"

输出:

$ cat slurm-2105323.out
echo 2 0
echo 2 1
echo 2 2

我明白了这句话,我明白了:

  1. 我必须逃避内联",因为我用"包装我的--wrap=命令。"确保sbatch不会过早终止我的命令。
  2. 解除对Xi的引用是不同的。我可以接受这是因为需要区分--wrap=命令的外部和内部变量。

现在让我们尝试一些更复杂的东西。让我们尝试使用反引号来执行命令并将其赋值给一个变量。

$ X=2 
$ sbatch --wrap="for((i=0; i<3; i++)); do TMP=`echo "${X} $i"`; echo ${TMP}; done"

输出
$ cat slurm-2105326.out
2
2
2

显然,它成功地解引用了X,但没有解引用i。我尝试了转义字符、额外的$和大括号的各种组合。我似乎无法让它解引用i

:

  1. 我如何在上面的命令中解引用内部变量i,在sbatch --wrap=语句中使用反引号执行?

需要转义反引号,就像转义内部变量前面的引号和$一样。否则,它们将被原始shell解释,而不是由sbatch运行的shell,并且原始shell将

$ sbatch --wrap="for((i=0; i<3; i++)); do TMP=`echo "${X} $i"`; echo ${TMP}; done"

顺便说一句,在现代shell脚本中,最好使用$()而不是反引号。这样更容易看到,它们嵌套正确(您需要使用额外的转义来嵌套反引号),并且读者不太可能将它们误认为引号。您仍然需要转义它以使其在sbatchshell中运行。

$ sbatch --wrap="for((i=0; i<3; i++)); do TMP=$(echo "${X} $i"); echo ${TMP}; done"

最新更新