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

Bash脚本中ffprobe获取数值后数字比较报错的排查与解决

问题:ffprobe获取视频高度后数值比较报错

场景与初始代码

我在脚本中需要对比常量1080和通过ffprobe获取的视频高度(报错信息里的474是探测到的实际高度),初始代码如下:

CURRENT_RES=$(ffprobe -v quiet -select_streams v:0 -show_entries stream=height -of csv=s=x:p=0 "${fn}")
if [[ $CURRENT_RES -gt 1080 ]]; then
    echo "leaving preset normal"
    SLOW_PRESET=("" "")
else
    echo "setting preset to slow"
    SLOW_PRESET=(-preset slow)
fi;

报错情况

执行后出现语法错误:

/usr/local/bin/startScreen.sh: line 95: [[: 474

474: syntax error in expression (error token is "474")
setting preset to slow

尝试其他写法仍报错

改用算术运算符的写法:

if (($CURRENT_RES>1080)); then
    echo "leaving preset normal"
    SLOW_PRESET=("" "")
else
    echo "setting preset to slow"
    SLOW_PRESET=(-preset slow)
fi;

得到类似错误:

/usr/local/bin/startScreen.sh: line 95: ((: 474

474>1080: syntax error in expression (error token is "474>1080")
setting preset to slow

更奇怪的是,在这段代码下方15行的另一条比较语句if [[ $CURRENT_RES -gt $CONVERT_HEIGHT ]]; then却能正常运行。我曾以为是直接写常量1080导致的问题,把1080赋值给变量后重试,结果还是报错。

排查过程

根据建议用cat -v调试,发现获取到的高度值被重复输出。为了进一步排查,执行了返回JSON格式的ffprobe命令:

ffprobe -v quiet -select_streams v:0 -show_entries stream=height -of json "filename.mp4"

发现返回的JSON里存在重复的height数据:

{
    "programs": [
        {
            "streams": [
                {
                    "height": 472
                }
            ]
        }
    ],
    "streams": [
        {
            "height": 472
        }
    ]
}

原来问题出在ffprobe返回了两组高度数据,导致CURRENT_RES变量里存了两个带换行的数值,shell在做数值比较时无法识别这种格式。

解决方法

修改ffprobe命令,结合jq工具提取正确的单条高度值:

CURRENT_RES=$(ffprobe -v quiet -select_streams v:0 -show_entries stream=height -of json "${fn}" | jq .streams[0].height)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:46:06