我想通过bash将TX数据包计数读入变量。在shell上我可以用$ ifconfig eth0| grep "TX packets" | awk '{print $2}' | cut -d ":" -f2
提取它,所以我试着把它放在一个脚本中并提出:
2: #!/bin/bash
3:
4: THRESHOLD=1000
5: ADAPTER="eth0"
6: IFSTR="TX packets"
7: AWKCMD= "\'\{print \$2\}\'"
8: CUTCMD="-d \":\" -f2"
9: CMD="ifconfig $ADAPTER | grep $IFSTR | awk $AWKCMD | cut $CUTCMD"
10: echo $CMD
现在它一直抱怨AWKCMD线:
/home/ron/scripts/keepup.sh: line 7: \'\{print $2\}\': command not found
ifconfig eth0 | grep TX packets | awk | cut -d ":" -f2
如何让bash将其正确解释为变量?
答案 0 :(得分:3)
假设你的内核是Linux,你最好要求内核给你自己想要的号码:
adapter=eth0
tx_packets=$(</sys/class/net/"$adapter"/tx_packets) || {
echo "Could not find $adapter" >&2; exit 1
}
echo "Adapter $adapter sent $tx_packets packets"
通过这种方式,您对未来可能会消失的工具不可靠。 Linux上的ifconfig
已经维持了十多年,现在支持iproute2套件了。此外,sysfs是ifconfig
从中获取数字的地方 - 所以你直接去那里就是砍掉了很多中间商。
至于您对脚本的尝试,请参阅BashFAQ #50以获取有关其失败原因的完整详细说明以及如何在不将代码放入字符串的情况下重用代码。就个人而言,如果我将以这种方式解析ifconfig
的输出,我可能写道:
#!/bin/bash
# ^^^^- pipefail not guaranteed to work with /bin/sh, so use bash here!
set -o pipefail # ensure that pipeline fails if ifconfig does
adapter="eth0"
tx_packets=$(ifconfig "$adapter" | awk '/TX packets/ {print $2}' | cut -d ":" -f2) || exit
echo "Adapter $adapter sent $tx_packets packets"
但是,我根本不会建议解析ifconfig
的输出。
请注意,此输出格式在操作系统中并未标准化,因此您不能依赖该名称(对于特定于操作系统的接口配置工具)的流行来暗示输出格式符合任何特定标准。