我正在尝试为自定义屏幕保护程序编写一个简单的bash脚本,如果处于空闲状态,我希望简单地将屏幕变为黑色,如果没有,则恢复正常。
#!/bin/bash
#sets display gamma very low, for screensaver purposes
idle=false
idle_after=3000 #in milliseconds
while true; do
#if system is idle
if [[ idle_now=$(xprintidle) -gt "$idle_after" && "$idle"=false ]] ;then
echo "1"
`xrandr --output HDMI-0 --brightness 0.01`
idle=true
fi
if [[ idle_now=$(xprintidle) -lt "$idle_after" && "$idle"=true ]] ; then
echo "2"
`xrandr --output HDMI-0 --brightness 1` #set screen back to normal
exit
fi
done
我真的不知道为什么第二个if查询首先被执行。 我认为空闲变量已初始化" false"在启动时 谁可以给我解释一下这个 ?如果有人改进了我的方法,我将非常感谢,谢谢
答案 0 :(得分:1)
您的测试表达式错误。
首先执行第二个if
的原因是测试中的操作数和运算符之间没有空格([[
和]]
)。
为了更好地理解,假设xprintidle
返回10
,我们在第一个循环中看到可能的变量替换:
[[ idle_now=$(xprintidle) -lt "$idle_after" && "$idle"=true ]]
# becomes
[[ idle_now=10 -lt 3000 && false=true ]]
现在您想要将10与3000进行比较,但现在您将字符串"idle_now=10"
与3000
进行比较。如果字符不是数字,任何字符串都会转换为零,就像你做的那样:
[[ 0 -lt 3000 && false=true ]]
# that becomes
[[ <true> && false=true ]]
现在,第二个操作数也是一个字符串“false = true”(不是比较),当它为空时,任何转换为boolean的字符串都是false。这不是你的情况,字符串有10个字符,所以它被评估为真。
[[ <true> && <true> ]]
# that becomes
<true>
注意:我使用<true>
和<false>
来澄清,它们实际上是布尔值的内部表示。
修复
我想idle_now
是一个从未使用过的变量,所以我们会忽略它。
所以if表达式应该是:
[[ "$(xprintidle)" -gt "$idle_after" && "$idle" = false ]]
# and
[[ "$(xprintidle)" -lt "$idle_after" && "$idle" = true ]]