我想比较两个十进制值,但我收到错误.我用了
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then
Run Code Online (Sandbox Code Playgroud)
正如其他Stack Overflow线程所建议的那样.
我收到了错误.
这是怎样的正确方法?
Pau*_*ce. 38
你可以使用Bash的数字上下文来做到这一点:
if (( $(echo "$result1 > $result2" | bc -l) )); then
Run Code Online (Sandbox Code Playgroud)
bc将输出0或1,(( ))它们将分别解释为false或true.
使用AWK同样的事情:
if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
Run Code Online (Sandbox Code Playgroud)
小智 8
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y"
then
echo z not greater than y
else
echo z greater than y
fi
Run Code Online (Sandbox Code Playgroud)
跟进丹尼斯的回复:
尽管他的回复对于小数点是正确的,但 bash 会抛出(standard_in) 1:浮点运算语法错误。
result1=12
result2=1.27554e-05
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
Run Code Online (Sandbox Code Playgroud)
尽管退出代码为 0,但这会返回错误的输出并带有警告。
(standard_in) 1:语法错误
r1 < r2
虽然对此没有明确的解决方案(讨论线程 1和线程 2awk ),但我使用了以下部分修复方法,即使用bcDennis 的回复和该线程中的命令对浮点结果进行四舍五入
四舍五入到所需的小数位:以下将获得以 TB 为单位的递归目录空间,并四舍五入到小数点后第二位。
result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}')
Run Code Online (Sandbox Code Playgroud)
然后,您可以像上面一样使用 bash 算术,或者[[ ]]像下面的线程一样使用封装。
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
Run Code Online (Sandbox Code Playgroud)
或使用-eq运算符,其中bc1 的输出为true,0 为false
if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
echo "r1 < r2"
else
echo "r1 > r2"
fi
Run Code Online (Sandbox Code Playgroud)
小智 5
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
echo "$result1 is greater than $result2"
fi
Run Code Online (Sandbox Code Playgroud)