bash中的百分比精度

时间:2014-02-19 03:52:03

标签: bash precision

这是我的bash脚本中的罪魁祸首:

bat_percent=`echo "$bat_percent * 100" | bc | sed 's/.00//'`

当bat_percent以100输出时,它会输出.00

如果我要将其更改为:(删除。并添加0)

bat_percent=`echo "$bat_percent * 100" | bc | sed 's/000//'`

甚至:(3 0和a。)

bat_percent=`echo "$bat_percent * 100" | bc | sed 's/000.//'`

输出为100.00

我该怎么做才能说100,同时保持其他百分比,比如87或5?

我会回答任何后续行动:)

验尸

这是完成的代码,感谢你们的帮助! (另外:停下来互相投票!让我们成为朋友,m'kay?)

my_ac_adapt=`ioreg -w0 -l | grep ExternalConnected | awk '{print $5}'` 
cur_power=`ioreg -w0 -l | grep CurrentCapacity | awk '{print $5}'` 
max_power=`ioreg -w0 -l | grep MaxCapacity | awk '{print $5}'` 
bat_percent=`echo "scale=2;$cur_power / $max_power" | bc` 
bat_percent=`echo "$bat_percent * 100" | bc | sed 's/\..*//'` 
if [ "$my_ac_adapt" == "Yes" -a "$bat_percent" == "100" ] 
then 
echo "Charged" 
elif [ "$my_ac_adapt" == "Yes" -a "$bat_percent" != "100" ] 
then 
echo "Charging: $bat_percent%" 
else 
echo "Battery: $bat_percent%" 
fi 

此代码获取电池的当前状态,并通知您:)

2 个答案:

答案 0 :(得分:3)

当您使用sed 's/.00//'时,它基本上意味着匹配任何字符(.的意思)后跟00,并将其替换为空。因此,当您的输出中有100.00时,sed会正确删除100,并为您提供.00

你真正需要的是用\

来逃避特殊角色

... | sed 's/\..*//'

答案 1 :(得分:2)

试试这个:

bat_percent=`echo "$bat_percent * 100" | bc | sed 's/\.00//'`

sed命令的问题在于,您没有将.转义为\.以将其用作文字;正则表达式中未转义的.与任何字符匹配。

如果输入为"100.00",则/.00/100匹配(因为.,因为匹配任何字符。匹配1),而不是.00 {1}}。

或者,如果你总是只想删掉小数部分,试试这个:

bat_percent=$(bc <<<"$bat_percent * 100" | cut -d'.' -f 1)