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

Bash中if语句浮点数比较:基于SAC文件DIST值执行命令的问题

解决Bash中SAC文件浮点数距离(DIST)的条件判断问题

你的问题核心在于Bash的[(test命令)不支持浮点数比较——你用的[ "$DST" <= "5000" ]是字符串比较逻辑,对于带小数的DIST值(比如3313.7),这种方式会出现判断错误(比如DIST为600.9时,字符串"600.9"会被认为比"5000"大,因为首字符'6'的ASCII码高于'5',导致错误跳过处理)。

下面是两种修复后的脚本方案,都能正确处理浮点数比较:

方案1:使用bc工具处理浮点数判断

bc是Unix系统自带的任意精度计算器,非常适合做浮点数运算和比较:

for i in *sac
do
    # 用$(...)替代反引号,可读性更好且支持嵌套
    DST=$(saclhdr -DIST "$i")
    # 用bc执行浮点数比较,返回1表示条件成立,0表示不成立
    if (( $(echo "$DST <= 5000" | bc -l) )); then
        gsac << EOF
cut b b 1200
r $i
w append .cut
quit
EOF
    fi
done

方案2:使用awk工具处理浮点数判断

awk对数值处理的支持更原生,写法也更简洁:

for i in *sac
do
    DST=$(saclhdr -DIST "$i")
    # 通过awk的退出码判断:条件成立时exit 0(Bash视为真),否则exit 1(Bash视为假)
    if awk -v dst="$DST" 'BEGIN { exit !(dst <= 5000) }'; then
        gsac << EOF
cut b b 1200
r $i
w append .cut
quit
EOF
    fi
done

额外优化建议

  • 给变量$i加上双引号"$i",避免文件名包含空格时出现错误;
  • 如果需要调试,可以在循环里加上echo "Processing $i, DIST: $DST",方便查看每个文件的处理状态;
  • 优先用$(...)替代旧的反引号`...`,它的可读性和兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:52:42