Bash if-then-else基于命令输出

Bash if-then-else基于命令输出,bash,if-statement,Bash,If Statement,我正在使用netstat命令获取网络信息。我想在这里对获取的协议设置一个条件。如果是TCP,我需要打印与UDP不同的列 下面是我试图做的,但它不起作用。如果我做错了什么,请提出建议: if [$(netstat -anputw | awk '{print $1}')=="tcp"] then netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv elif [$(net

我正在使用netstat命令获取网络信息。我想在这里对获取的协议设置一个条件。如果是TCP,我需要打印与UDP不同的列

下面是我试图做的,但它不起作用。如果我做错了什么,请提出建议:

if [$(netstat -anputw | awk '{print $1}')=="tcp"] then

netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv

elif [$(netstat -anputw | awk '{print $1}')=="udp"] then

netstat -anputw | awk '{print $5,",",$7}' >> $HOME/MyLog/connections_$HOSTNAME.csv

fi

在if语句中,始终在
[
之后和
]
之前留一个空格,如果要进行字符串比较,则应将命令
$(netstat-anputw | awk'{print$1}'
放在双引号下

以下是最后的脚本:

if [ "$(netstat -anputw | awk '{print $1}')" == "tcp" ]; then

netstat -anputw | awk '{print $1,",",$4"}' >> $HOME/MyLog/connections_$HOSTNAME.csv

elif [ "$(netstat -anputw | awk '{print $1}') " == "udp" ]; then

netstat -anputw | awk '{print $5,",",$7}' >> $HOME/MyLog/connections_$HOSTNAME.csv

fi

我不知道您想要实现什么,但是我认为netstat返回的是列表而不是字符串,因此将输出与字符串进行比较是没有意义的。您必须循环它。请尝试以下方法

#!/bin/bash

OUTPUT=$(netstat -anputw | awk '{print $1}');

for LINE in $OUTPUT
do
    if [[ $LINE == "tcp" ]] ; then
        echo "TCP!"
    elif [[ $LINE == "udp" ]] ; then
        echo "UDP!"
    fi
done

你为什么不让
netstat
把这两种情况混为一谈呢

netstat -anptw   # Just tcp
netstat -anpuw   # Just udp
另外,在tcp情况下,您似乎并不关心
-p
信息,因此您最好不要要求它。在udp情况下,State列中没有数据,因此PID/程序名实际上将位于第6列

综上所述,我得到:

netstat -antw | awk '{print $1","$4}' >> $HOME/MyLog/connections_$HOSTNAME.csv
netstat -anpuw | awk '{print $5","$6}' >> $HOME/MyLog/connections_$HOSTNAME.csv
不过,我怀疑这也不是您要查找的信息。也许您想区分TCP侦听连接和非侦听连接