我正在写一个bash脚本,它向我展示了对我来说很重要的所有tcp连接。为此,我使用netstat -atp
。它看起来像这样:
num_haproxy_443_established=$(netstat -atp | grep ESTABLISHED | grep :https | grep haproxy | wc -l)
printf "\n show ESTABLISHED connections port 443 \n"
printf " %s" $num_haproxy_443_established
在bash脚本中我有一些这些调用,现在我想优化它并只调用netstat -atp
一次并重用结果。我试过了:
netstat_res=$(netstat -atp)
num_haproxy_443_timewait=$("$netstat_res" | grep TIME_WAIT | grep :https | grep haproxy | wc -l)
printf " %s" $num_haproxy_443_timewait
执行脚本后,我总是得到0: command not found
错误消息。如何在$(...)中使用变量?
谢谢!
答案 0 :(得分:1)
如果您有类似A="foo"
的内容,则$("$A")
将解析为调用子shell中的程序foo
。
所以你只需要回显变量的内容,然后从中获取grep:
num_haproxy_443_timewait=$(echo "$netstat_res" | grep TIME_WAIT ...)
答案 1 :(得分:1)
您可以使用shell数组来存储netstat
命令:
# your netstat command
netstat_res=(netstat -atp)
# then execute it as
num_haproxy_443_timewait=$("${netstat_res[@]}" |
awk '/TIME_WAIT/ && /:TIME_WAIT/ && /haproxy/{++n} END{print n}')
echo $num_haproxy_443_timewait
另请注意,您可以通过一次grep
来避免多次awk
来电。
相关BASH常见问题解答:I'm trying to put a command in a variable, but the complex cases always fail!
答案 2 :(得分:0)
在你的情况下,$ netstat_res是结果但不是COMMAND,如果你想保存结果并且不仅使用它一次,将结果保存到文件是更好的方法,例如:
netstat -atp > /tmp/netstat_status.txt
num_haproxy_443_timewait=$(cat /tmp/netstat_status.txt | grep TIME_WAIT | grep :https | grep haproxy | wc -l)
printf " %s" $num_haproxy_443_timewait