我在运行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
我明白了这句话,我明白了:
- 我必须逃避内联
"
,因为我用"
包装我的--wrap=
命令。"
确保sbatch
不会过早终止我的命令。 - 解除对
X
和i
的引用是不同的。我可以接受这是因为需要区分--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
。
:
- 我如何在上面的命令中解引用内部变量
i
,在sbatch --wrap=
语句中使用反引号执行?
需要转义反引号,就像转义内部变量前面的引号和$
一样。否则,它们将被原始shell解释,而不是由sbatch
运行的shell,并且原始shell将
$ sbatch --wrap="for((i=0; i<3; i++)); do TMP=`echo "${X} $i"`; echo ${TMP}; done"
顺便说一句,在现代shell脚本中,最好使用$()
而不是反引号。这样更容易看到,它们嵌套正确(您需要使用额外的转义来嵌套反引号),并且读者不太可能将它们误认为引号。您仍然需要转义它以使其在sbatch
shell中运行。
$ sbatch --wrap="for((i=0; i<3; i++)); do TMP=$(echo "${X} $i"); echo ${TMP}; done"