ポート番号をパラメータとして使用し、そのポートのサービス名を見つけるためのスクリプトを作成しようとしています。スクリプトは次のとおりです。
#!/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ブロックの値はです。awk
exit !0
exit 1
found=1
exit !found
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
次のようにすることもできます。
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"}))"