1

在过去的几天里,我为 Openbox 制作了几个管道菜单,这很有趣,因为我以前对 bash 一无所知。一个显示了 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)

无需再次使用 cat ,因为 awk 可以自己接受输入或解析文件:

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 回答
1

实际上看起来还不错:)

可以进行一些微优化。

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

您可以使用以下方法保存流程和执行:

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

现在/完整的行为也可以简化。但是,老实说,有时这些更改可能会使它的可读性不如现在。你可以对你所做的很满意。

于 2013-09-04T13:39:02.270 回答
1

而不是说:

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

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

说:

Batt=$(awk '{ printf("%.2f\n", $1/$2 * 100) }' /sys/class/power_supply/BAT0/charge_now /sys/class/power_supply/BAT0/charge_full)

编辑:

似乎输入文件Batt包含一个需要划分的数字。你可以说:

Batt=$(echo "scale=2; 100 *" $(cat /sys/class/power_supply/BAT0/charge_now) / $(cat /sys/class/power_supply/BAT0/charge_full) | bc -l)

以达到预期的结果。

于 2013-09-04T13:40:21.920 回答