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

이전에 정의되지 않은 경우 변수의 기본값은 0(또는 true) 이기 exit !found때문에 작동합니다 . 따라서 일치 시간을 설정하면 END 블록의 값은 입니다 .awkexit !0exit 1found=1exit !foundexit 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

다음과 같이 할 수도 있습니다.

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"}))"

관련 정보