bash - 变量未在 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
如上预期输出中所示,如何在双引号内扩展变量值?
解决方案
您的双引号字符串在单引号内,不会被扩展。
相比:
foo=bar
echo 'foo=\""$foo\"'
echo 'foo="'"$foo"'"'
在第二个示例中,我们结束单引号和双引号$foo
,然后为 final 开始新的单引号'
。
如果我们改为使用扩展,它可能更容易阅读printf
:
printf 'foo=%s\n' "$foo"
这就是您可能希望作为进程替换运行的东西。
但...
这是构造 SQL 查询的一种错误且危险的方法(如果 Web 服务器转发任意查询,它也很糟糕——我希望它没有对数据的写入权限)。阅读有关“ SQL 命令注入”的内容,并在了解问题后返回此代码。
推荐阅读
- java - List到底是什么以及何时使用它?
- python - 在 Selenium Python 中处理表
- json - 如何处理杰克逊中的变量字段类型?
- node.js - Vscode:节点在服务反应构建路径时运行旧版本的代码
- javascript - Joi 验证:or() 和 xor() 条件取决于字段值
- javascript - 使用 Ajax 手动搜索数据表
- firebase - 当推送通知到达时做一些事情 React Native
- android - Android - 在设备级别安装 pfx 证书并以编程方式访问它
- python - 使用数据帧中的多索引值创建哈希
- java - 如何在 Java 中将 ISO 8601 解析为日期?