首页 > 解决方案 > 变量未在 bash 脚本的双引号中扩展

问题描述

我有一个 bash 脚本,我试图在其中调用一个以变量值作为输入的 curl。尝试执行 bash 脚本时,变量值没有在双引号中展开。

变量扩展后脚本中的预期 curl 应如下所示:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id="fgsd34sff334" '

在调试模式下观察时执行如下:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" '

我的 bash 脚本如下:

#!/bin/bash

idp_sub=""


for idp_sub in $(cat /opt/SP/jboss/home/mayur/es_idp_sub.txt)

do

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt


done

如上预期输出中所示,如何在双引号内扩展变量值?

标签: bashshellvariables

解决方案


您的双引号字符串在单引号内,不会被扩展。

相比:

foo=bar
echo 'foo=\""$foo\"'
echo 'foo="'"$foo"'"'

在第二个示例中,我们结束单引号和双引号$foo,然后为 final 开始新的单引号'

如果我们改为使用扩展,它可能更容易阅读printf

printf 'foo=%s\n' "$foo"

这就是您可能希望作为进程替换运行的东西。

但...

这是构造 SQL 查询的一种错误危险的方法(如果 Web 服务器转发任意查询,它也很糟糕——我希望它没有对数据的写入权限)。阅读有关“ SQL 命令注入”的内容,并在了解问题后返回此代码。


推荐阅读