我正在一個運行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=陳述句中使用反符號執行的?
uj5u.com熱心網友回復:
你需要轉義反鉤,就像你轉義引號和內部變數前的$一樣。否則它們會被原始的shell解釋,而不是被sbatch運行的shell解釋,原始shell會
$ sbatch --wrap="for((i=0; i<3; i )); do TMP=`echo "${X} $i"`; echo ${TMP}; done"
BTW,在現代的shell腳本中,最好使用$()而不是背號。它更容易被看到,它們可以正確地嵌套(你需要使用額外的轉義來嵌套反斜線),讀者不太可能把它們誤認為是引號。你仍然需要轉義以使它在sbatch shell中運行。
$ sbatch --wrap="for((i=0; i<3; i )); do TMP=$(echo "${X} $i"); echo ${TMP}; done"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324978.html
標籤:
上一篇:在bash腳本中對包含單引號和雙引號的字串進行斷行。
下一篇:用特殊的排序號進行排序
