Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 双引号不能帮助我传递带空格的字符串参数_Bash_Quoting - Fatal编程技术网

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

Bash 双引号不能帮助我传递带空格的字符串参数,bash,quoting,Bash,Quoting,我正在编写一些bash脚本,以便更容易地使用将作业提交到计算集群,对于我需要的选项,它们说它们使用SQL语法(选项-p) 在某些情况下,我使用以下命令: oarsub-q生产-p“GPU='GTX 980'”-l“节点=1,walltime=00:05”-I 其中,我希望能够通过用户提供的输入更改GTX 980和00:05 我成功地将时间作为输入,并使GPU保持不变: oarsub-q生产-p“GPU='GTX980'”-l“节点=1,walltime=$1”-I 我已经尝试过使用双引号,如这些

我正在编写一些bash脚本,以便更容易地使用将作业提交到计算集群,对于我需要的选项,它们说它们使用SQL语法(选项-p)

在某些情况下,我使用以下命令:

oarsub-q生产-p“GPU='GTX 980'”-l“节点=1,walltime=00:05”-I

其中,我希望能够通过用户提供的输入更改GTX 980和00:05

我成功地将时间作为输入,并使GPU保持不变:

oarsub-q生产-p“GPU='GTX980'”-l“节点=1,walltime=$1”-I

我已经尝试过使用双引号,如这些答案所述。但参数扩展似乎一直在进行:

echo "$2"
oarsub -q production -p "GPU = "$2"" -l "nodes=1,walltime=$1" -I
manuel@machine$:bash job_script.sh 00:05“GTX 980”
GTX980
...
/!\ 你要求一份互动式的工作,所以我将忽略争论:980;你的语法正确吗?
...
[准入规则]作业属性:(GPU=GTX)和维护='否'
生成作业密钥。。。
错误的资源请求(错误:列“gtx”不存在
第4行:…alltime>=300或max_walltimeOguz 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

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

尝试
oarsub-q production-p“GPU='$2'-l“nodes=1,walltime=$1”“我< /代码> @曼努埃尔,你明白为什么这是正确的答案吗?想想你的双引号是如何开始和结束原来的命令,<代码> OARSUB-Q生产-P“GPU=’GTX 980’-L”节点=1,WalthTime:00:05。-I
,GTX 980
部分已经包含双引号。添加另一组双引号将有效地取消原始双引号,消除其影响。非常感谢@oguzismail,所以我只需要将第二个参数放在单引号和非双引号之间。这是否也意味着需要传入第二个参数单引号而不是双引号,对吗?我甚至不知道oarsub是做什么的,我只是简单地指出了引号的问题:
“GPU=\”$2\”
oarsub -q production -p 'GPU = '\'"$2"\' -l 'nodes=1,walltime='\'"$1"\' -I