首页 > 解决方案 > 读取浮点数

问题描述

我正在尝试从“2.0 / 3.0”之类的字符串中收集数据。但是当我尝试以下操作时出现错误。

for i in t01 t02 t03 t04 t05 t06 t07 t08 t09 t10 t11; do
    if [ -e "$i/feedback.txt" ]; then
    
        grade=`tail -1 $i/feedback.txt | tr -d [:blank:]`
        if [[ $grade =~ ^[0-9]+\.?[0-9]*/[0-9]+\.?[0-9]*$ ]]; then
            IFS='/' read -ra grArray <<< "$grade"
          
                       
            score=${grArray[0]}
            max=${grArray[1]}
            total_tmax=$total_tmax+$max
            total_t=$total_t+$score
            echo $i: $score / $max
        else 
            echo $i: 0 / 0

输出

t01: 4 / 4
t02: 2 / 3
t03: 3 / 3
t04: 3 / 3
t02/pp_marks.sh: line 39: 13+3.0: syntax error: invalid arithmetic operator (error token is ".0")

标签: bashsyntax-error

解决方案


根据评论,bash 不允许浮点运算,只允许整数。对于简单的任务,您可以使用该bc工具(对于更复杂的操作,请考虑使用脚本引擎,如awkpythonperl)。请注意,使用 bc 您必须指定精度。

total_tmax=$(bc <<<"scale=1 ; $total_tmax+$max")
total_t=$(bc <<< "scale=1 ; $total_t+$score")
echo "$i: $score / $max"

另请参阅:如何在 bash 中使用浮点除法?


推荐阅读