私のラップトップのバッテリーをチェックしてAndroid通知を送信するBashスクリプトがあります(Pushbullet APIへのcliインターフェースとして機能する私が書いたBashスクリプト、Shuttle経由)。うまくいきますが、バッテリーが100%に達すると、ラップトップを取り外すように警告が繰り返し表示されます。代わりに、100%の充電について一度だけ通知し、そのままにしておくことをお勧めします。ただし、バッテリーが不足しているときに繰り返し通知を送信すると、ノートパソコンを接続することを覚えています(現在はそうします)。
私はこれがループ内でcontinueとbreakコマンドを使用して実行できると思いますが、それが私が望むものであるかどうかはわかりません(私はこれについてよく知りません)。
とにかく、Bashを使ってこれを実装するための最良の方法の提案をいただきありがとうございます。これは簡単だと思いますが、何らかの理由で理解できません。
これは私のスクリプトです。
#! /bin/bash
while true;
do
percent=$(acpi | awk '{ print $4}' | sed -e 's/%//g' | sed -e 's/,//g')
if [ "$percent" -le "20" ];
then
shuttle push note Chrome "Aurora: Plug in now" "Battery is at $percent percent"
fi
if [ "$percent" -eq "100" ];
then
shuttle push note Chrome "Aurora: Battery charged" "Battery is at $percent percent"
fi
sleep 7m
done
ベストアンサー1
push(){
shuttle push note Chrome \
"Aurora: $1" \
"Battery is at $percent percent"
}
full=0
while percent=$(acpi | awk '{ print $4}' | sed 's/[,%]//g')
do case $percent:$full in
(100:1) ;; (100:0)
full=1
push 'Battery charged';;
(?:*|1?:*|20:*)
full=0
push 'Plug in Now';;
(*1) full=0
esac
done
シェルのcase
文を使用すると、シェルパターンがシェル拡張値と一致するかどうかに応じて任意のコードブロックを実行できます。これにより、同じテストの複数の可能な結果を非常に簡単に処理できます。
$percent
$full
上記では、コロン区切り文字の値と値を連結しています:
。この技術はもともとStephane Chazelasから学び、それ以来私自身もかなり上手になりました。実行されるコードは2つの値に依存するため、2つの値を同時にテストするのが最も簡単なソリューションです。
case
パターンブロックは、最初から最後まで順に評価されます。パターンが一致すると、そのコードが実行されてcase
返されます。一致する最初のパターンは評価された最後のパターンでもあります。
$percent
したがって、値がそれぞれ次$full
の場合:
100と1
- 空のコードブロックに関連付けられた最初のパターンが一致しました。何の処置も取らず
case
に戻りますwhile
。
- 空のコードブロックに関連付けられた最初のパターンが一致しました。何の処置も取らず
100と0
- 2番目のパターンが一致し、1に設定され、
$full
シェル関数が引数で呼び出されます。push
Battery Charged
push()
ここでは、目的に応じてコードを構築するためにのみ定義します。
- 2番目のパターンが一致し、1に設定され、
<= 20と何でも
- 3番目のパターンマッチングは
$full
0に設定され、push
argとして呼び出されます。Plug in Now
。
- 3番目のパターンマッチングは
何でも1
- 最後のパターンが一致して
$full
0に設定されました。
- 最後のパターンが一致して
その他
- 一致するパターンがなく、何もしません。
全体として$full
、これは必要な場合にのみ設定され、push()
0、100、または任意の値で<= 20の場合にのみ呼び出されることを意味します。$full
$percent
$full
$percent
これらすべては、あなたがすでに持っているものよりも向上します。しかし、実際の質問は次のとおりです。
percent=$(acpi | awk '{ print $4}' | sed 's/[,%]//g')
while true
のように何度もフォークしてください。信じられないゴミ。別の方法を見つける必要があります。