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

