我正在尝试比较两个十进制值,但出现错误。我用了
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ];then
正如其他堆栈溢出线程所建议的那样。
我收到错误。
解决这个问题的正确方法是什么?
你可以使用 Bash 的数字上下文来做到这一点:
if (( $(echo "$result1 > $result2" | bc -l) )); then
bc
将输出 0 或 1,(( ))
并将它们分别解释为 false 或 true。
使用 AWK 做同样的事情:
if (( $(echo "$result1 $result2" | awk '{print ($1 > $2)}') )); then
if awk 'BEGIN{exit ARGV[1]>ARGV[2]}' "$z" "$y"
then
echo z not greater than y
else
echo z greater than y
fi
if [[ `echo "$result1 $result2" | awk '{print ($1 > $2)}'` == 1 ]]; then
echo "$result1 is greater than $result2"
fi
跟进丹尼斯的回复:
尽管他的回答对于小数点是正确的,但 bash throws (standard_in) 1: syntax error with floating point algorithm。
result1=12
result2=1.27554e-05
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
尽管退出代码为 0,但这会返回带有警告的错误输出。
(standard_in) 1: 语法错误
r1 < r2
虽然对此没有明确的解决方案(讨论线程 1和线程 2awk
),但我使用了以下部分修复方法,通过使用后跟使用bc
丹尼斯的回复和此线程中的命令来四舍五入浮点结果
四舍五入到所需的小数位:以下将获得以 TB 为单位的递归目录空间,并在小数点后第二位四舍五入。
result2=$(du -s "/home/foo/videos" | tail -n1 | awk '{$1=$1/(1024^3); printf "%.2f", $1;}')
然后,您可以使用上面的 bash 算术或使用以下线程[[ ]]
中的附件。
if (( $(echo "$result1 > $result2" | bc -l) )); then
echo "r1 > r2"
else
echo "r1 < r2"
fi
或使用输出 1 为真而 0 为假-eq
的运算符bc
if [[ $(bc <<< "$result1 < $result2") -eq 1 ]]; then
echo "r1 < r2"
else
echo "r1 > r2"
fi
对于 shell 脚本,我不能使用双括号 (())。所以,帮助我的是将它分成两行并以经典方式进行比较。
low_limit=4.2
value=3.9
result=$(echo "${value}<${low_limit}" | bc)
if [ $result = 1 ]; then
echo too low;
else
echo not too low;
fi
你也可以echo
声明if...else
到bc
。
- echo $result1 '>' $result2
+ echo "if (${result1} > ${result2}) 1 else 0"
(
#export IFS=2 # example why quoting is important
result1="2.3"
result2="1.7"
if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ]; then echo yes; else echo no;fi
if [ "$(echo "if (${result1} > ${result2}) 1 else 0" | bc -l)" -eq 1 ];then echo yes; else echo no; fi
if echo $result1 $result2 | awk '{exit !( $1 > $2)}'; then echo yes; else echo no; fi
)
不能 bash 强制类型转换?例如:
($result1 + 0) < ($result2 + 0)
为什么使用 bc ?
for i in $(seq -3 0.5 4) ; do echo $i ; if [[ (( "$i" < 2 )) ]] ; then echo "... is < 2";fi; done
唯一的问题:比较“<”不适用于负数:它们被视为绝对值。