条件意外评估

时间:2016-11-23 15:36:47

标签: bash shell

我正在尝试为自定义屏幕保护程序编写一个简单的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"在启动时 谁可以给我解释一下这个 ?如果有人改进了我的方法,我将非常感谢,谢谢

1 个答案:

答案 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 ]]