2016-11-23 18 views
0

私はカスタムスクリーンセーバー用の簡単な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 

2番目のifクエリが最初に実行される理由はわかりません。 私はアイドル変数が起動時に "false"で初期化されていると思った 誰かが私にこれを説明することができますか?誰かが改善の余地があるなら私は非常に感謝します。ありがとう

+4

条件文での問題に加えてhttp://www.shellcheck.net/ –

+0

によって識別されるスクリプトといくつかの基本的な問題があり、 'xrandr'コマンドの前後に逆引用符があるのはなぜですか?それはコマンドの出力(もしあれば)をとり、それをコマンドとして実行しようとします...そして、私はそれが 'xrandr'の仕組みではないと思います。 –

答えて

1

あなたのテスト表現が間違っています。

第2のifが実行された理由は、オペランドとテスト中のオペレータとの間に空白がないことです([[および]])。よりよく理解するために

、のはxprintidle戻り10と仮定して最初のループで可能な変数置換を見てみましょう:

[[ idle_now=$(xprintidle) -lt "$idle_after" && "$idle"=true ]] 
# becomes 
[[ idle_now=10 -lt 3000 && false=true ]] 

は今、あなたは3000に対して10を比較したかったが、今は3000に対して文字列"idle_now=10"を比較しているが。任意の文字列をゼロに変換される文字は、数字でない場合はそのあなたがやったように:今

[[ 0 -lt 3000 && false=true ]] 
# that becomes 
[[ <true> && false=true ]] 

は、第2オペランドはまた、1つの文字列「偽=真」(ない比較)で、任意の文字列を変換ブール値にすると、空のときはfalseになります。それはあなたの場合ではなく、文字列は10文字なので、真と評価されます。

[[ <true> && <true> ]] 
# that becomes 
<true> 

注:私はちょうど明確にする<true><false>を使用し、彼らは本当にブール値の内部表現です。私はidle_nowが、それは決して使用だという変数であることを意味した想像し、私たちはそれを無視するでしょう、それ

を修正

だから表現があるべき場合:

[[ "$(xprintidle)" -gt "$idle_after" && "$idle" = false ]] 
# and 
[[ "$(xprintidle)" -lt "$idle_after" && "$idle" = true ]] 
+0

あなたの助けを大変ありがとうございます。だから言うべきことです:if式でスペースのない '='は割り当てを意味し、スペースは - >比較を意味しますか? – user5356132

+0

いいえ、スペースを入れないと、他の文字列と同じ意味になります。例: '[[a = 1]]'は '[[" a = 1 "]]'に等しく、それは空文字列ではないのでに変換されます。変数を割り当てるには '[[]]'の外や '((a = 1))'のようなbash式の中で行う必要があります。 – WPomier

関連する問題