PHP有mysql_real_escape_string()
函数来正确转义可能会引起问题的任何字符。如何在BASH中模仿这个功能呢?
是否有办法使用BASH进行预处理的mysql语句?这似乎是最好的方法。
我的大多数变量不会(也不应该)具有特殊字符,但我允许用户完全自由地选择密码。它可能包含像'和"这样的字符。
我可能会执行多个SQL语句,所以我想编写一个脚本,接受参数然后运行语句。这是我到目前为止写的:
doSQL.sh:
#!/bin/sh
SQLUSER="root"
SQLPASS="passwor339c"
SQLHOST="localhost"
SQL="$1"
SQLDB="$2"
if [ -z "$SQL" ]; then echo "ERROR: SQL not defined"; exit 1; fi
if [ -z "$SQLDB" ]; then SQLDB="records"; fi
echo "$SQL" | mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST $SQLDB
还有一个使用该命令的例子:
example.sh:
PASSWORD=$1
doSQL "INSERT INTO active_records (password) VALUES ('$PASSWORD')"
如果密码中包含单引号,显然这将失败。
a
中给出$#时,似乎会失败。 - ParoXa='$#'; printf ...; echo ...
给了我\$#
。你得到了什么?除非你告诉我,否则我无法判断它为何“似乎失败”。 - Dennis Williamsonprintf -v CMD_ESCAPED %q "$CMD_RESULT" CMD_ESCAPED="${CMD_ESCAPED:1}"
之后它就可以正常工作了。 - OnTheFlymysql ... -e 'select * from job where name = '"'$(printf "%q" "$(printf "\ua0")")'" db
并且它可以工作,但我不确定与“连接/数据库字符集”有关的任何信息。 - KamilCuk