You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:40:33