我的bash文件是愚蠢的,可以简化吗?

时间:2013-09-04 13:27:29

标签: bash

我在过去几天为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 个答案:

答案 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)

以达到理想的效果。