如何在bash脚本中传递变量的双引号值作为curl命令的参数?

Posted

技术标签:

【中文标题】如何在bash脚本中传递变量的双引号值作为curl命令的参数?【英文标题】:How to pass a double quoted value of a variable, as argument of the curl command, in a bash script? 【发布时间】:2015-05-05 10:16:20 【问题描述】:

我在服务器上有一个脚本,它的最后一行是打印值的回显 类似这样的 URL:

.
.     < the script code here >
.
echo "url"      # The last line of this script

我无法更改此脚本,我只能 捕获其返回值,即捕获url作为返回值 在我的本地 bash 脚本中声明的变量中,如下所示:

cmd_url=$(ssh . . . <distinct script>)

以下是此类 URL 的示例(出于保密原因,当然 我更改了值)

http://mydomain:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/running?type=app&name=AppTest&pw=abcd&9e0Xy

上面的例子主要是一个 WebObjects 应用程序信息 URL,它可以作为一个 curl 命令的参数,以了解应用程序是否 正在运行(因此本示例中的应用程序名称为 AppTest 并且 JavaMonitor 为了能够查询,我必须提供的密码是 abcd&9e0Xy)

如果我打开一个终端,我可以简单地粘贴这个网址用单引号括起来和 运行以下

curl -s -X GET 'http://mydomain:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/running?type=app&name=AppTest&pw=abcd9e0Xy'

所以我必须将字符串括在单引号中以转义特殊字符,并且效果很好,如果应用程序 AppTest 正在运行,那么 curl 返回 YES

现在我需要做的就是完全按照我上面写的去做,除了它是在里面完成的 一个 bash 脚本,并且 url 不是手动写在单引号内,而是 它存储在一个变量中。

这是我的工作:

cmd_url=$(ssh . . . <distant script>)
ret_msg=$(curl -s -X GET "$cmd_url")

问题是(我认为)由于 URL 中的特殊字符。似乎 curl 无法 正确解释论证。我什至删除了双引号,但没有 解决问题。

所以我的问题是:我应该如何进行?如何转换已经双引号的字符串 (回想一下,这是在远程服务器上完成的,我无法更改) 单引号字符串?所以 curl 会把它当作一个字符序列 不解释它们?就像我上面在终端示例中写的:

'http://mydomain:56789/cgi-bin/WebObjects/JavaMonitor.woa/admin/running?type=app&name=AppTest&pw=abcd9e0Xy'

到目前为止,我已经尝试了可能的单引号串联的不同组合 但问题仍然存在。 curl 根本不返回任何内容,或者我收到一条错误消息 提示未提供密码。

有什么想法吗?如何在 bash 脚本中传递 已经双引号的局部变量来 curl?

提前致谢

【问题讨论】:

我在该字符串中看不到任何内容(除非实际密码不同),无论您是单引号还是双引号,都会有不同的处理方式。您看到的实际错误或失败是什么? ret_msg=$(curl -s -X GET "$cmd_url") 应该可以工作。 您能否澄清一下其他脚本是否实际将双引号作为其输出的一部分打印出来? (注意echo "url" 不打印双引号——shell 在将字符串传递给echo 之前将它们删除。)此外,脚本输出中是否还有其他有趣的字符?尝试otherscript | cat -vet 使非打印字符可见。 【参考方案1】:

您可以使用tr 将双引号翻译成单引号

$ echo \"foo\" | tr '"' "'"
'foo'

【讨论】:

感谢您的建议,我尝试使用 tr 但同样的问题仍然存在。

以上是关于如何在bash脚本中传递变量的双引号值作为curl命令的参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

如何删除多余的双引号,而不是使用bash脚本在一行文本中打开和关闭双引号

从 JSON 对象/字符串或 Java 脚本变量中删除开头和结尾的双引号?

Bash——反引号内的双引号

如何在curl PUT请求的主体中使用环境变量?

如何在bash脚本中运行curl并将结果保存在变量中[重复]