我正在尝试创建脚本,它可以让我将端口号作为参数,然后找到该端口的服务名称。这是脚本:
#!/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
Run Code Online (Sandbox Code Playgroud)
一切正常,但有一个问题。如果我键入这样的端口 99999(或另一个虚构端口)-“退出状态”grep -E "\W$1\/" /etc/services | awk '{ print $1 }'
也将为 0。这样我的脚本的所有结果都将是正确的,并且else
我的脚本中的语句将不起作用。我要怎么做才能找到这个问题的解决方案,让我的else
工作在“退出状态”下正常运行?
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
Run Code Online (Sandbox Code Playgroud)
之所以exit !found
有效,是因为awk
如果之前未定义变量,则它们默认为零(或真) -exit !0
是exit 1
. 所以如果我们found=1
在匹配时设置,那么exit !found
在 END 块中是exit 0
.
以下是如何在 if/then/else 中使用该 awk 脚本。
#!/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
Run Code Online (Sandbox Code Playgroud)
你也可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
或者甚至像这样:
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)!"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
545 次 |
最近记录: |