如何在mysql -Bse命令中转义变量中的单引号?
在mysql -Bse命令中转义含单引号的变量
问题描述
执行以下bash命令:
echo "mysql -u root nextcloud -Bse 'DELETE FROM oc_filecache WHERE path=\""${FILE_PATH}"\";'"
输出的命令内容为:
mysql -u root nextcloud -Bse 'DELETE FROM oc_filecache WHERE path="files_encryption/keys/files/xxx/xxxx/xxx L'AME/2xxxx/OC_DEFAULT_MODULE/master_x626.shareKey";'
由于路径中包含单引号,直接执行该命令会因引号嵌套错误失效;脚本中执行以下命令也无法删除目标行:
mysql -u root nextcloud -Bse 'DELETE FROM oc_filecache WHERE path="${FILE_PATH}";'
但在HeidiSQL中直接执行以下SQL语句可成功删除对应行:
DELETE FROM oc_filecache WHERE path="files_encryption/keys/files/xxx/xxxx/xxx L'AME/2xxxx/OC_DEFAULT_MODULE/master_x626.shareKey";
需要解决的核心问题:如何在mysql -Bse命令中正确转义变量里的单引号?
可行解决方案
方案1:先转义变量再拼接命令
先将FILE_PATH中的单引号替换为MySQL支持的转义格式(两个连续单引号''),再构造执行命令:
# 转义变量中的单引号 ESCAPED_FILE_PATH="${FILE_PATH//\'/''}" # 执行MySQL命令 mysql -u root nextcloud -Bse "DELETE FROM oc_filecache WHERE path='$ESCAPED_FILE_PATH';"
MySQL的字符串规则中,两个连续单引号会被解析为单个单引号,这样就能正确匹配含单引号的路径。
方案2:使用Bash Heredoc简化引号处理
通过Bash的Heredoc语法传递SQL语句,无需手动转义变量中的单引号,Heredoc会原样解析变量内容:
mysql -u root nextcloud <<EOF DELETE FROM oc_filecache WHERE path="$FILE_PATH"; EOF
这种方式避免了多层引号嵌套的混乱,可读性更强,适合处理复杂字符串变量。
内容的提问来源于stack exchange,提问作者Alex Lum
相关产品推荐
相关产品推荐

