我正在尝试创建脚本,它可以让我将端口号作为参数,然后找到该端口的服务名称。这是脚本:
#!/bin/bash
grep -E "\W$1\/" /etc/services | awk '{ print $1 }'
if [ $? -eq 0 ]; then
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi
一切都很完美,但有一个问题。如果我输入诸如 99999(或另一个虚构端口)之类的端口 -“退出状态”grep -E "\W$1\/" /etc/services | awk '{ print $1 }'
也将为 0。这样我的脚本的所有结果都将是正确的,并且else
我的脚本中的语句将不起作用。我该怎么做才能找到这个问题的解决方案并让我的else
工作以“退出状态”正常进行?
答案1
grep
你根本不需要这里,awk
可以对端口号进行模式匹配。
awk
还可以跟踪是否找到端口并使用适当的退出代码退出。
例如:
$ port=23
$ awk '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services
telnet
$ echo $?
0
$ port=99999
$ awk '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services
$ echo $?
1
这是有效的exit !found
,因为awk
如果变量之前没有定义过,则默认为零(或 true) -exit !0
是exit 1
.因此,如果我们设置found=1
匹配时间,则exit !found
END 块中的值为exit 0
。
以下是如何将 awk 脚本与 if/then/else 一起使用。
#!/bin/bash
awk '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services
if [ $? -eq 0 ]; then
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi
你也可以这样做:
if awk '$2 ~ /^'"$1"'\// {print $1;found=1} END{exit !found}' /etc/services ; then
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi
或者甚至像这样:
awk '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services \
&& echo "Service(s) is(are) found correctly!" \
|| echo "There is(are) no such service(s)!"
答案2
x=$(sed -ne"\|^\([^ ]*\) *\($1\)/.*|!d;h;s//\2/p;g" \
-e's||Found service: \1|w /dev/fd/2' -eq </etc/services)
exit "$((!${x:?No service found for: "$1"}))"