我在过去几天为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>"
答案 0 :(得分: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")
答案 1 :(得分: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
答案 2 :(得分:1)
实际上看起来很不错:)。
可以做一些微观优化。
Wifi=$(cat /proc/net/wireless | awk 'NR==3 {print $3}')
您可以使用以下方式保存流程和执行:
Wifi=$(awk 'NR==3 {print $3}' < /proc/net/wireless)
现在/完整行为也可以简化。但是,老实说,有时候这些变化可能会使它的可读性低于现在。你可以对你所做的事情感到非常满意。
答案 3 :(得分: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)
以达到理想的效果。