Bash脚本中SQLite查询返回0,但条件语句无法识别该值
问题原因
Bash的if语句默认判断的是命令的执行退出状态码,而非命令输出的内容。sqlite3只要能成功执行查询语句,不管输出的是0还是1,它的退出状态码都是0(代表命令执行成功),所以你的if条件永远为真,只会走“找到”的分支。
解决方案
方法1:捕获查询输出并判断数值
把sqlite3的查询结果存到变量里,直接判断变量的值是否为1:
sqlite3 jail.db "SELECT jid FROM tester" | while read jid; do # 捕获查询结果到变量 exists=$(sqlite3 jail.db "select exists(select 1 from test2 where jid='$jid' limit 1)") # 判断变量值是否为1 if [ "$exists" -eq 1 ]; then echo "$jid: i found it" else echo "$jid: i did not find it" fi done
注意:如果
jid是字符串类型,一定要给$jid加单引号,避免SQL语法错误或注入风险。
方法2:用单条SQL完成所有判断(更高效)
循环调用sqlite3效率很低,直接用SQL的逻辑一次性查出所有结果,不需要Bash循环:
sqlite3 jail.db " SELECT t.jid, CASE WHEN EXISTS(SELECT 1 FROM test2 WHERE jid = t.jid) THEN 'i found it' ELSE 'i did not find it' END AS result FROM tester t "
这种方式只需要调用一次sqlite3,执行效率远高于循环查询,输出结果会直接显示每个jid对应的判断结果。
内容的提问来源于stack exchange,提问作者Christian Heffner
相关产品推荐
相关产品推荐

