Bash中转义双引号失效及MySQL命令执行报错求助
这问题我之前也碰到过好几次,bash里嵌套引号确实容易踩坑,尤其是当查询里既有单引号又有括号这类特殊字符的时候。给你几个靠谱的解决办法,你可以选最适合自己的:
1. 用单引号包裹整个查询,内部单引号用双单引号转义
这是bash里处理单引号最稳妥的方式之一——bash会把连续两个单引号解析成一个单引号,而且单引号包裹的内容会被当成「原样字符串」,里面的括号、换行等特殊字符不会被bash解析,直接传给mysql:
mysql -e 'SELECT * FROM your_table WHERE name=''O''Neil'' AND (status=1 OR status=2)'
比如原来SQL里的'O'Neil',改成''O''Neil''后,bash会正确识别成带单引号的字符串'O'Neil',括号也能正常作为SQL的一部分被mysql处理。
2. 用Here-Doc传递查询(最适合复杂SQL)
如果你的查询逻辑复杂、行数多,用Here-Doc会让代码可读性高很多,完全不用纠结引号转义的问题:
mysql -u your_user -p your_db <<EOF SELECT * FROM your_table WHERE name='O'Neil' AND (status=1 OR status=2); EOF
EOF之间的内容会原封不动传递给mysql,里面的单引号、括号、换行都能正常识别,写起来和直接在mysql客户端里写SQL没区别。
3. 用反斜杠转义(不推荐,仅作补充)
如果你一定要用双引号包裹外层命令,那里面的单引号和括号都需要用反斜杠转义——因为双引号内的特殊字符(比如括号、$、`)会被bash解析,所以得明确告诉bash这些是SQL的一部分:
mysql -e "SELECT * FROM your_table WHERE name='O\'Neil' AND \(status=1 OR status=2\)"
不过这种方式容易出错,尤其是查询里有更多特殊字符的时候,不如前两种方法省心。
你之前碰到的-bash: command substitution: line 21: syntax error near unexpected token '('错误,本质是bash把双引号里的括号当成了shell语法(比如分组或子命令),而不是SQL的一部分,所以才触发了语法错误。用前两种方法基本能解决99%的这类引号和特殊字符问题。
内容的提问来源于stack exchange,提问作者MTK

