1

ここ数日、Openbox 用のパイプ メニューをいくつか作成しました。以前は bash について何も知らなかったので、これは楽しかったです。1 つは df の出力を表示しましたが、メニュー幅の制限がこれを台無しにしたようです。一方、これは私にとってダンディのように機能します。私はそれがどのように機能するかを完全には理解していないので、私自身の bash/awk 教育のために、bc や acpi など、インストールしていない可能性のあるものを使用せずに単純化できますか?

#!/bin/sh

now=`cat /sys/class/power_supply/BAT0/charge_now`
full=`cat /sys/class/power_supply/BAT0/charge_full`

Date=$(date '+%R %a %x')
Wifi=$(cat /proc/net/wireless | awk 'NR==3 {print $3}')
Batt=$(echo $now $full | awk '{ printf("%.2f\n", $1/$2 * 100) }')

echo "<openbox_pipe_menu>"

echo "<separator label=\"$Date\"/>"
echo "<separator />"
echo "<item label=\"Wifi:  $Wifi%\"/>"
echo "<item label=\"Batt: $Batt%\"/>"

echo "</openbox_pipe_menu>"
4

4 に答える 4

3

まず、bash の場合は、適切なヘッダーを使用します。

#!/bin/bash

を使用する必要はありません。使用するcatだけ$(<)です:

now=$(</sys/class/power_supply/BAT0/charge_now)
full=$(</sys/class/power_supply/BAT0/charge_full)

awk はそれ自体で入力を受け入れたり、ファイルを解析したりできるため、再度 cat を使用する必要はありません。

Wifi=$(awk 'NR==3 {print $3}' /proc/net/wireless)

変数を""適切に引用してください:

Batt=$(echo "$now $full" | awk '{ printf("%.2f\n", $1/$2 * 100) }')

基本的にそれは私が見ることができるすべてです。

アップデート

user000001 で提案されているように、ここで文字列を使用することもできます。

Batt=$(awk '{ printf("%.2f\n", $1/$2 * 100) }' <<< "$now $full")
于 2013-09-04T13:35:22.207 に答える
2

ここに文書化し、ファイル引数を使用して次のことを行いawkます。

#!/bin/bash
cat <<EOF
<openbox_pipe_menu>
<separator label="$(date '+%R %a %x')" />
<separator />
<item label="Wifi: $(awk 'NR==3 {print $3}' /proc/net/wireless)%" />
<item label="Batt: $(awk '{ printf("%.2f\n", $1/$2 * 100) }' /sys/class/power_supply/BAT0/charge_{now,full})%"/>
</openbox_pipe_menu>
EOF
于 2013-09-04T13:39:47.150 に答える