Mysql的引擎不理解$fut
作为变量。应该使用什么语法来完成这项工作?如何嵌入BASH变量在MySQL查询在shell脚本文件
回答
您需要从EOF
删除"
:
#!/bin/bash
fut=$(date -d "+14 days" +'%Y-%m-%d')
echo $fut
mysql -u user -ppassword base1 << EOF
INSERT INTO tableB SELECT * FROM tableA WHERE startdate < $fut;
....many lines of MySQL....
EOF
从庆典docs:
当 “限制字符串” 被引用或转义无参数替换。
无论何时您将简单的字符串替换为SQL查询,您都会打开注入攻击的可能性。在这种情况下,'$ fut'的值由代码设置,而不是外部源,因此风险可以忽略不计。但总的来说,你应该考虑使用一种语言绑定,它允许你在MySQL层处理参数替换的预处理语句。这包括Perl,Python,Ruby和任何JVM语言。在我看来,与RDBMS交互是一个很好的“时间从bash上升到别的东西”的路标。 –
请注意,这不同于例如Perl,尊重引号的类型:在<< <<“EOF”'内替换,但不在'<< EOF''内。另一方面,壳用*任何*引号关闭替代;即使'<< \ EOF'也有这种效果。 –
我在使用here-document时没有问题,但是我想提出另一种稍微冗长的可能性,但是当你可能不得不做更多的变量时,一个函数。
#!/bin/bash
sql_statement()
{
local fut=$(date -d "+14 days" +'%Y-%m-%d')
echo "INSERT INTO tableB SELECT * FROM tableA WHERE startdate < $fut;"
echo "....many lines of MySQL...."
}
mysql -u user -ppassword base1 < <(sql_statement)
这不是在该具体情况下所需,但允许该函数具有附加逻辑(例如if
块,循环......),以产生更复杂的或可变的SQL语句。作为一个通用的解决方案,它有很好的优势。
马克里德关于安全性的评论也适用于此,对于理解这一点非常重要。尽管如此,系统必须与外部数据进行交互,因此在堆栈中的某处必须有一个能胜任的程序员来控制或清理所使用的数据,并有一位能够保护系统免受篡改的有能力的管理员(因为最后,如果你不信任你的shell,你的系统实用程序,你的数据库引擎没有受到感染或者错误操作,那么你真的不能完成很多)。 – Fred
- 1. 如何在bash shell脚本变量中查找子字符串
- 2. 的Bash shell脚本变量
- 3. 在bash shell脚本中启动动态变量(变量变量)
- 4. 从bash脚本查询mysql
- 5. 如何检查mysql查询在shell脚本中是成功的
- 6. 如何查找bash脚本变量只读文件的值?
- 7. 如何在shell脚本中设置变量文件夹
- 8. 通过shell脚本将变量文本名写入文件
- 9. shell脚本导入mysql dump文件
- 10. bash脚本shell输入
- 11. 将mysql命令行查询的结果放入bash脚本变量中
- 12. 如何在shell脚本文件中导入linux命令作为变量的值?
- 13. Shell Bash脚本在写入文件时循环
- 14. 在bash中,为什么变量在shell中可见,但不在shell脚本中
- 15. 阵列在bash shell脚本
- 16. Shell脚本变量
- 17. 如何在shell脚本中加入2个变量?
- 18. Bash Unix Shell脚本接受输入并设置系统变量
- 19. Bash shell脚本
- 20. Bash/Shell脚本
- 21. shell脚本BASH
- 22. 的Bash shell脚本:如何设置JAVA_HOME环境变量
- 23. 在shell脚本中将bash变量传递给python命令
- 24. 比较在bash shell脚本,两个字符串变量
- 25. Bash Shell脚本:嵌套Select语句
- 26. BASH shell脚本文件解析[新手]
- 27. 如何使shell脚本在现有文件上写入输入
- 28. shell脚本:写入文件
- 29. 写入文件shell脚本
- 30. Bash条件与shell变量
几乎所有的SQL语言都应该有一种内部生成时间戳的方法,而不需要通过shell注入值。在这种情况下,'ADDDATE(CURDATE(),14)'看起来是必需的SQL代码。 – chepner