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

Bash脚本中if语句字符串比较失效问题排查求助

Bash字符串对比失效问题分析与解决

你的问题根源在于file_exists变量中包含了不可见的空白字符(比如前导/尾随空格、换行符),导致和$base.jsonl的纯字符串对比不相等。

问题原因

psql的-t参数会输出带格式的结果,包含多余的换行、前导空格和尾随空格;后续的grep也不会自动清理这些空白。从你的输出FILE EXISTS: LoD2_326625712.jsonl LoD2_326625712.jsonl能看出来,file_exists前面有两个空格,说明变量本身带了前导空白。

解决方案

方案1:清理变量中的空白字符

在赋值时直接去除file_exists的前后空白和换行:

file_exists=$(psql -h "$DB_SERVER" -U "$DB_USER" -d "$DB_DATABASE" -t -c "SELECT source_file FROM $DB_SCHEMA.cj_metadata WHERE source_file LIKE '%$base%';" | grep "$base" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')

这里用sed命令去掉了字符串开头和结尾的所有空白(空格、制表符、换行)。

方案2:改用SQL精确查询,避免字符串对比

更可靠的方式是直接让SQL判断文件是否存在,不需要提取字符串再对比:

# 直接检查数据库中是否存在目标文件
if psql -h "$DB_SERVER" -U "$DB_USER" -d "$DB_DATABASE" -t -c "SELECT 1 FROM $DB_SCHEMA.cj_metadata WHERE source_file = '$base.jsonl';" | grep -q "1"; then
    echo "File $base.jsonl is already saved in DB. Exiting function."
    echo "SELECT source_file FROM cjdb.cj_metadata WHERE source_file = '$base.jsonl';"
    return
fi

grep -q会静默检查是否有匹配结果,不需要处理输出格式,避免了空白字符的干扰。

调试技巧

如果不确定变量是否有多余字符,可以用以下命令查看变量的真实内容:

echo "|$file_exists|"

如果输出是| LoD2_326625712.jsonl |,就说明变量前后有空白,需要清理。

内容的提问来源于stack exchange,提问作者pcace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:42:16