我如何优化这个 bash 脚本,以便将背光亮度以 5% 的增量设置,并且不产生舍入误差?

我如何优化这个 bash 脚本,以便将背光亮度以 5% 的增量设置,并且不产生舍入误差?

代码如下:

#!/bin/bash

blDir='/sys/class/backlight/intel_backlight'
brightness=$(cat $blDir/brightness) # current brightness
max=$(cat $blDir/max_brightness)    # maximum brightness
percentage=$(echo "scale=3; ($brightness/$max)*100" | bc | awk '{print int($1+0.5)}')

case $BLOCK_BUTTON in
    # brightness up %5
    4) echo $(( $brightness + ( $max / 20 ) )) > $blDir/brightness ;;   
    # brightness down %5
    5) echo $(( $brightness - ( $max / 20 ) )) > $blDir/brightness ;;   
esac

if (( $percentage >= 5 )); then
    # output current brightness
    echo "☀ $percentage%"
else
    # output '0%' instead of '%'
    echo "☀ 0%"
fi

这是一个用于显示的脚本,让我可以调整窗口管理器状态栏中的背光亮度。我从这个脚本中回显的内容就是状态栏中显示的内容。输出中看起来像星号的东西只是一个 unicode 太阳图标。$BLOCK_BUTTON 是我在光标悬停在其上时按下的按钮,其中 4 代表向上滚动,5 代表向下滚动。它可以很好地显示当前亮度。每当我向上滚动时,亮度就会以 5% 的增量从 0% 增加到 55%。然后它变为 59%、64%、69%、74% 等。为什么会这样?这是某种舍入误差吗?我该如何修复它,以便它以 5% 的增量增加到 100%。

答案1

我建议根据剩余的最大值计算当前亮度值与每一步要设置的值之间的差值。这样,舍入误差就不会累积。

使用我的机器的文字最大值,以下是演示:

$> cat tuner.sh

current=0
max=4437
for step in {0..19}; do
   diff=$(echo "($max - $current)  / (20-$step)" | bc )
   current=$(echo "$current + $diff" | bc )
   echo "$current / $max"
done

$> ./tuner.sh
221 / 4437
442 / 4437
663 / 4437
885 / 4437
1107 / 4437
1329 / 4437
1551 / 4437
1773 / 4437
1995 / 4437
2217 / 4437
2439 / 4437
2661 / 4437
2883 / 4437
3105 / 4437
3327 / 4437
3549 / 4437
3771 / 4437
3993 / 4437
4215 / 4437
4437 / 4437

如果差异始终相同,则错误会累积:

$> cat badtuner.sh

current=0
max=4437
for step in {0..19}; do
   diff=$(echo "$max / 20" | bc )
   current=$(echo "$current + $diff" | bc )
   echo "$current / $max"
done

$> ./badtuner.sh
221 / 4437
442 / 4437
663 / 4437
884 / 4437
1105 / 4437
1326 / 4437
1547 / 4437
1768 / 4437
1989 / 4437
2210 / 4437
2431 / 4437
2652 / 4437
2873 / 4437
3094 / 4437
3315 / 4437
3536 / 4437
3757 / 4437
3978 / 4437
4199 / 4437
4420 / 4437

对于此建议,您必须存储一个步进计数器,以便知道当前除数应该是多少来计算差异。

相关内容