双引号不能帮助我传递带空格的字符串参数

时间:2019-04-27 09:37:10

标签: bash quoting

我正在编写一些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

我已经尝试使用对这些答案123所说的双引号。但是似乎参数扩展一直在发生:

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之间可能存在一些问题?

1 个答案:

答案 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

通过这种方式,您可以完全控制哪些部分可以扩展以及哪些部分可以分词。但是,在您的情况下这不是必需的。因此,您可以按照上面的建议进行操作,到目前为止,这些建议更容易阅读,因此更加清晰。