我正在编写一些bash脚本,以简化使用oar syntax向计算集群提交作业的过程,对于该选项,我需要他们说他们使用SQL语法(选项-p)。
对于某些情况,这是我正在使用的命令:
oarsub -q production -p "GPU = 'GTX 980'" -l "nodes=1,walltime=00:05" -I
我希望能够通过用户提供的输入来更改GTX 980和00:05。
我已经很成功,只花时间作为输入并保持GPU固定:
oarsub -q production -p "GPU = 'GTX 980'" -l "nodes=1,walltime=$1" -I
我已经尝试使用对这些答案1,2,3所说的双引号。但是似乎参数扩展一直在发生:
echo "$2"
oarsub -q production -p "GPU = "$2"" -l "nodes=1,walltime=$1" -I
manuel@machine$: bash job_script.sh 00:05 'GTX 980'
GTX 980
...
/!\ You asked for an Interactive job SO I will ignore arguments: 980 ; Is your syntax right?
...
[ADMISSION RULE] Job properties : (GPU = GTX) AND maintenance = 'NO'
Generate a job key...
Bad resource request (ERROR: column "gtx" does not exist
LINE 4: ...alltime >= 300 OR max_walltime <= 0)) AND ((GPU = GTX) AND m...
由于/!\ You asked for an Interactive job SO I will ignore arguments: 980 ; Is your syntax right?
警告,似乎并没有将整个“ GTX 980”作为一个完整的字符串,而是将它们分为“ GTX”和“ 980”。
这是我可以将GPU名称作为bash输入参数传递给命令的一种方法吗?还是在bash
如何格式化并将输入传递给oarsub
之间可能存在一些问题?
答案 0 :(得分:0)
this comment中的Oguz ismail的建议完全正确。但是,如果另一个位置参数$1
的值也可能
包含一些空格,您也应该引用它。由于这些引号确实
否则无害,请在任何情况下引用它:
oarsub -q production -p "GPU = '$2'" -l "nodes=1,walltime='$1'" -I
请注意:调用shell会将其扩展为类似
oarsub -q production -p GPU = 'blah blah' -l nodes=1,walltime='foo bar' -I
其中GPU = 'blah blah'
和nodes=1,walltime='foo bar'
被视为单个单词,应按原样作为单个参数传递给oarsub
。
除此之外,通常不必分层嵌套命令行的引用部分:您可以简单地将它们串联起来,基本上是这样的:
oarsub -q production -p 'GPU = '\'"$2"\' -l 'nodes=1,walltime='\'"$1"\' -I
通过这种方式,您可以完全控制哪些部分可以扩展以及哪些部分可以分词。但是,在您的情况下这不是必需的。因此,您可以按照上面的建议进行操作,到目前为止,这些建议更容易阅读,因此更加清晰。