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
相关产品推荐
相关产品推荐

