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 }'なります。これにより、スクリプトの結果がすべて正確になり、スクリプトの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)!"

おすすめ記事