battery_percentage.shSelectRawtextBitbucket
#!/bin/sh

# show the remaining battery percentage

cap=`ioreg -l | grep Capacity`
full=`echo $cap | sed -e "s/^.*MaxCapacity\" = \([0-9]*\).*/\1/"`
curr=`echo $cap | sed -e "s/^.*CurrentCapacity\" = \([0-9]*\).*/\1/"`
pct=`echo "scale=3; $curr / $full * 100" | bc`
echo -----
printf "%.1f%%\n" $pct


実行環境


目的:リモートログインしてバッテリ残量を知りたい
8232425と、TeamViewerを使ってWindowsからMacBookを操作しました。TeamViewerは実機と同じ画面なのでバッテリ残量が右上に表示されますが、ちょうどTeamViewerのメニューを引っ張り出す部分が ↓ のように被る時があります。特に画面の幅を小さくすると。


MacBookは、AC電源につなぎ放しだと常にバッテリ100%充電になって気になるので、80%程度になったらバッテリ駆動に切り替え、残量が適当に減ったら(40%という話があるけど詳細は未調査)ACするといいかも。本当にそうするかは別として、やるとしたらバッテリ残量を簡単に確認したいです。

TeamViewerMacに接続していると上のような問題があると。また
昨日の最後に準備したSSHでのリモートログインも今後多用しそうなので、bashシェルでバッテリ残量を見るスクリプトを作っておけば一石二鳥になるというのが動機です。


スクリプト作成時の参考サイト
  1. mac日記 : Macのバッテリー状態を取得する(2)
  2. EZ-NET : Linuxシェルスクリプト プログラミング(sedの正規表現について)
  3. Stack Overflow : sedコマンド 正規表現+の扱い
  4. /bin/bash^M: bad interpreter:そのようなファイルやディレクトリはありません

1.で、バッテリ情報(最大容量、現存容量など)をioregコマンドで取得できると知りました。この出力を変数に入れ、sedの正規表現で最大容量(MaxCapacity)と現存容量(CurrentCapacity)の数値を取り出す際、2.3.を参考にしました。2.Perlsedの正規表現の表は大変便利です。3.で「macsedでは+を使えない」と知るまで、うまく数値を抽出できず嵌まってました。4.は、自分がスクリプトをWindows上で作成しており改行コードが当初CRLF(エディタのデフォルト)になってて動かず、このウェブページを見て解決しました(改行コードLFで再保存)。


bcコマンドでの有効桁数指定(scale)について
バッテリの「現存容量/最大容量」計算にbcコマンドを使いましたが、有効桁数(小数点以下の桁数)をscale変数で指定すると、途中の計算ごとにその桁数で打ち切られるため、最終的な桁数はprintfで指定しました。bcコマンドのscaleの動作例は ↓ を参照。最初の「33/100」が有効桁数10.3になり、それを100倍して30.0になります。「出力時の桁数指定」なら33.3のはず。
$ echo "scale=1; 33 / 100 * 100" | bc
30.0


実行例
↓ 普通のbashスクリプトと同様に実行し、バッテリ残量が%で表示されます。
$ ./battery_percentage.sh
-----
53.1%

今回は、Windows上のフォルダを共有しており(macからも読み書き可)そこにスクリプトを置き、WindowsSSHクライアントでリモートログインして実行しました。↓ 冒頭の画像の再掲と、TeamViewer内のデスクトップのバッテリ残量。スクリプトで算出した「現存容量/最大容量」と同じでした。