shell 我正在比较两个数字

qaxu7uf2  于 2023-03-09  发布在  Shell
关注(0)|答案(3)|浏览(130)

在if条件下比较两个十进制数时,我得到以下错误
./www.example.com:第8行:((:cpu.shbc:表达式中的语法错误(错误标记为"1.0公元前")| bc : syntax error in expression (error token is "1.0 | bc ")
./www.example.com:第8行:((:cpu.shbc:表达式中的语法错误(错误标记为"1.0公元前")| bc : syntax error in expression (error token is "1.0 | bc ")
./www.example.com:第8行:((:cpu.shbc:表达式中的语法错误(错误标记为"1.0公元前")| bc : syntax error in expression (error token is "1.0 | bc ")
./www.example.com:第8行:((:cpu.shbc:语法错误:算术运算符无效(错误标记为".0-〉1.0|公元前") invalid arithmetic operator (error token is ".0 -gt 1.0 | bc ")

#!/bin/bash
val1=$*
for i in $val1
do
    if (( $i -gt 1.0 | bc ))
    then
        echo $i
    fi
done
inkz8wg9

inkz8wg91#

(( ... ))需要算术表达式。它不处理-gt,并且|表示 * 按位或 *,而不是管道。
算术表达式无法在bash中处理小数,使用bc是解决方案之一,但不能这样和(( ... ))合并,需要bc的输出,所以使用命令替换,bc不理解-gt,它使用传统的<>来比较数字。

if (( $(bc <<< "$i > 1.0") )) ; then
    echo $i
fi
8qgya5xd

8qgya5xd2#

请注意,使用大于号时(-gt)在if语句中比较数值大小,两个操作数都应该是数值,否则比较结果可能不符合预期。在本例中,当i的值为1.1时,您应该能够输出该值,但实际上此代码无法输出任何内容,因为使用大于号比较字符串不是数值比较,并且应该使用双括号或bc之类的命令来执行数值计算。

#!/bin/bash
for i in "$@"
do
    if (( $(echo "$i > 1.0" | bc -l) ))
    then
        echo $i
    fi
done

还需要注意的是,在for循环中使用“$@”迭代所有参数,可以确保正确处理每个参数,即使它包含空格等特殊字符。

rqmkfv5c

rqmkfv5c3#

你可以试试下面的代码:

#!/bin/bash
val=$*
for i in $val
do
   int=${i%.*}
   float=${i#*.}
   if [[ "$int" -gt 1  ]]
   then
           echo "$i"
   fi
   if [[ "$int" -eq 1  ]]
   then
     if [[ $((10#$float)) -gt 0 ]]
     then
           echo "$i"
     fi
   fi  
done

剥壳

./0303.sh 0.2  1.1 2 1.003  2.2 3.65

结果是:

1.1
2
1.003
2.2
3.65

相关问题