在Bash脚本中执行SQLite查询的正确引号转义方法是什么
问题原因
你遇到的报错由两个Bash特性共同导致:
- 未被双引号包裹的变量在展开时会触发单词拆分,空格、换行等分隔符会把变量内容切割为多个独立参数传给执行命令
- 写在变量值内部的转义引号仅会被识别为普通文本,不会被Bash当成参数边界符处理
你之前的写法中,${my_query}展开后会被拆分为'select、uid、from、lastlog;'四个独立参数,sqlite3除了数据库名test.db之外只接收一个SQL参数,多余的uid等参数无法识别,因此抛出错误。
正确写法
基础场景(SQL无内置单引号)
直接把SQL内容赋值给变量,调用时给变量套双引号即可:
# 变量定义无需额外加转义引号 my_query='select uid from lastlog;' # 调用时必须用双引号包裹变量,避免单词拆分 sqlite3 test.db "${my_query}"
扩展场景(SQL内置单引号)
如果SQL语句本身需要单引号(比如字符串匹配条件),可以用两种方式转义:
- 单引号包裹SQL时,用两个连续单引号表示字面量单引号:
my_query='select uid from lastlog where username=''admin'';'
- 双引号包裹SQL时,内部单引号直接写即可:
my_query="select uid from lastlog where username='admin';"
调用方式和基础场景一致,加双引号包裹变量即可。
内容的提问来源于stack exchange,提问作者loris
相关产品推荐
相关产品推荐

