如何将包含引号和空格的变量作为单个参数的一部分传递给命令

时间:2014-12-23 15:05:09

标签: linux bash

我的bash脚本中有以下行:

curl -i -X POST -H 'Content-Type: application/json-rpc' \
     -d '{"jsonrpc": "2.0", "method": "configuration.export", "params": { "options": { "templates": [ '$ftemplateids' ] }, "format": "xml"}, "auth": '$authtoken', "id": 1 }' \
     http://example.com/zabbix/api_jsonrpc.php |
grep jsonrpc | tail -c +28 | head -c -12 > file.xml

如您所见,有两个变量:$authtoken$ftemplateids。 我对$authtoken没有任何问题;它被解析没有任何问题。问题出在$ftemplateids

当我echo变量时,它显示为,这是所需的格式:

"10001", "10047", "10050", "10056", "10060", "10065", "10066", "10067", "10068", "10069", "10070", "10071", "10072", "10073", ......., "14433"

但是,当我运行脚本时,它会输出以下内容:

curl -i -X POST -H 'Content-Type: application/json-rpc' -d '{"jsonrpc": "2.0", "method": "configuration.export", "params": { "options": { "templates": [ "10001",' '"10047",' '"10050",' '"10056",' '"10060",' '"10065",' '"10066",' '"10067",' '"10068",' '"10069",' '"10070",' '"10071",' '"10072",' '"10073",' '"10074",' '"10075",' '"10076",' '"10077",' '"10078",' '"10079",' '"10081",' '"10082",' '"10083",' '"10086",' '"10089",' '"10592",' '"10595",' '"10599",' '"10726",' '"10737",' '"10739",' '"10758",' '"10763",' '"10764",' '"10769",' '"10776",' '"10809",' '"10810",' '"10876",' '"10880",' '"10881",' '"10882",' '"10921",' '"10924",' '"10961",' '"10966",' '"11005",' '"11006",' '"11007",' '"11008",' '"11010",' '"11011",' '"11012",' '"11035",' '"11036",' '"11037",' '"11038",' '"11120",' '"11126",' '"11146",' '"11147",' '"11148",' '"11149",' '"11151",' '"11167",' '"11168",' '"11169",' '"11170",' '"11264",' '"12256",' '"12264",' '"12281",' '"12315",' '"12418",' '"12420",' '"12780",' '"12788",' '"12799",' '"13771",' '"13772",' '"13776",' '"13781",' '"13790",' '"13791",' '"14433" ] }, "format": "xml"}, "auth": "authtokenwashere", "id": 1 }' http://example.com/zabbix/api_jsonrpc.php

我已经尝试了[ "$ftemplateids" ],但这没有帮助。

2 个答案:

答案 0 :(得分:4)

您使用双引号的直觉是正确的,但您仍需要终止单引号字符串。尝试:

… [ '"$ftemplateids"' ] …

答案 1 :(得分:1)

William Pursell提供了解决问题的正确方法。

为什么会发生这种情况的一些解释:

因为“shell扫描参数扩展的结果,命令替换和算术扩展,在双引号内没有出现 word splitting。”< / p>

  

shell将$IFS的每个字符视为分隔符,并将结果拆分        其他扩展到这些角色的文字。如果未设置IFS,则为        默认为<space><tab><newline>

在你的命令$ftemplateids中没有用双引号括起来,你的变量中有空格,所以你的变量被分成多个参数。