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

Bash字符串比较结果错误 相同文件大小判断进入异常分支

问题原因

你用的字符串比较语法本身没有错误,判断失效是因为wikipedia_download_filesize变量里藏了不可见字符:
HTTP响应头的行尾固定为CRLF格式(即\r\n换行),你通过curl拉取响应头时,匹配到的Content-Length字段值末尾会携带一个看不见的回车符\r。这个字符在echo打印时不会显示在终端输出里,所以你肉眼看到两个数值完全一致,实际第二个变量末尾多了\r,字符串比较自然会判定两者不相等,误进入下载分支。

另外你当前的取值逻辑还有两个隐藏问题:

  • 加了-L跟随跳转参数后,curl会返回每一跳跳转的响应头,你的awk匹配逻辑会拿到所有响应的Content-Length值,不一定是最终ZIM文件的真实大小
  • 本地不存在wikipedia.zim文件时,stat命令会直接报错,导致本地文件大小变量为空,后续判断逻辑完全失效
更合理的实现方式

文件大小本身是整数值,直接用整数比较比字符串比较容错性高很多——Bash做整数比较时会自动忽略值前后的空格、回车、换行这类空白控制字符,不会被不可见字符干扰判断。
修复后的完整脚本如下:

#!/bin/bash
ZIM_PATH="wikipedia.zim"
REMOTE_ZIM_URL="https://download.kiwix.org/zim/wikipedia_de_all_maxi.zim"

# 拉取远程文件大小:匹配Content-Length后清除所有非数字字符,取最后一个匹配值(对应最终跳转后的目标文件)
remote_size=$(curl -s -L -I "$REMOTE_ZIM_URL" | gawk -v IGNORECASE=1 '/^Content-Length/ { gsub(/[^0-9]/, "", $2); print $2 }' | tail -n 1)

# 本地文件不存在时本地大小记为0,直接触发下载
if [ -f "$ZIM_PATH" ]; then
  local_size=$(stat -c %s "$ZIM_PATH")
else
  local_size=0
fi

echo "Wikipedia filesize [current / download]:"
echo "$local_size / $remote_size"

# 整数比较:两个数值不相等则触发下载
if [ "$local_size" -ne "$remote_size" ]; then
  echo "Downloading newer version of Wikipedia..."
  # 此处补充实际下载命令即可,例如 curl -L -o "$ZIM_PATH" "$REMOTE_ZIM_URL"
else
  echo "No new version for Wikipedia available."
fi
关键修复点说明
  • 取值阶段直接通过awk的gsub(/[^0-9]/, "", $2)把Content-Length字段里所有非数字的字符(包括\r、空格、换行)全部清除,从根源避免不可见字符污染变量
  • 管道末尾加tail -n 1取最后一个Content-Length值,确保拿到的是跟随所有跳转后,最终ZIM文件的真实大小
  • 增加本地文件存在性判断,首次运行无本地文件时不会触发stat报错,直接走下载逻辑
  • 把字符串比较!=换成整数比较操作符-ne,语义匹配文件大小的数值属性,容错性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:09:21