bash 脚本中的退出状态

bash 脚本中的退出状态

我正在尝试创建脚本,它可以让我将端口号作为参数,然后找到该端口的服务名称。这是脚本:

#!/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 !0exit 1.因此,如果我们设置found=1匹配时间,则exit !foundEND 块中的值为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"}))"

相关内容