在后续bash命令中使用bash变量

时间:2017-06-20 09:06:43

标签: linux bash shell

我正在写一个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错误消息。如何在$(...)中使用变量?

谢谢!

3 个答案:

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