else コマンドの結果は効果がありません。

else コマンドの結果は効果がありません。

このスクリプトは機能します。

$cat list

IP address=192.3.xx.xx
IP address=192.4.xx.xx
IP address=192.19.xx.xx
IP address=192.22.xx.xx
$ cat myscript.sh

for i in `cat list | cut -d= -f2  | egrep '192.3|192.4'`
do
    if [ $? -eq 0 ]
    then
       echo $i
    else
       echo "no IP found"
    fi
done
$ ./myscript.sh

192.3.xx.xx
192.4.xx.xx

ただし、192.3と192.4を192.8などの他の値に変更すると、次の結果が得られます。

no IP found

スクリプトは何も返しません。

ご協力ありがとうございます。ありがとう

ベストアンサー1

したがって、ある場合cat list | cut -d= -f2 | egrep '192.8'の出力はegrep空であり、コマンド置換は空のままに拡張されます。ループforには繰り返す項目がなく、ループ本文は実行されず、「見つかりません」というメッセージを印刷する項目はありません。

$?ループ本体の最初からテストすることはとにかくあまり意味がありません。実際、最初の反復ではコマンド置換の終了状態をテストしていますが、以降の反復ではテストしています。前の反復の最後のコマンド、withはあまり役に立ちません。ここでは失敗する可能性はありませんが、echo他の操作を実行すると興味深い結果が得られます。

for i in `cat list | cut -d= -f2  | egrep '192.3|192.4'`
do
    if [ $? -eq 0 ]
    then
       # assume we're doing something more useful here
       echo "trying to do something with $i..."
       # but it happens to fail
       false
    else
       echo "no IP found"
    fi
done

出力は次のとおりです

trying to do something with 192.3.xx.xx...
no IP found

少し混乱しています。


ループが何も見つからない場合は、「or else」部分を実行する簡単な方法は、次のようにループにフラグを設定して後でテストすることです。

found=
key=192.8
for i in $(cat list | cut -d= -f2  | egrep "$key"); do
    found=1
    echo $i;
done
if [ -z "$found" ]; then
    echo nothing found
fi

この場合はまだ少し愚かですが、すべてのループがデフォルトforで行うことは、すでに印刷していたのとegrep同じ内容を印刷することです(しかも正しく機能するにはトークン化に依存していますが、とにかくグローバル文字がない可能性があります)。 。

おそらくIPアドレスを使って別の作業をしているようですが、印刷するだけの場合は、出力を直接使用して終了ステータスを確認して一致egrepするものを確認することをお勧めします。

key=192.8
if ! cat list | cut -d= -f2  | egrep "$key"; then
    echo "nothing found"
fi

または、出力ラインを配列として読み取って処理します。 Bashでは、次のものを使用できますreadarray

readarray -t ips < <(cat list | cut -d= -f2  | egrep "$key")
num=${#ips[@]}
if [ "$num" = 0 ]; then
    echo "zero items in list"
else 
    echo "found $num items"
fi
for ip in "${ips[@]}"; do
    echo "doing something with $ip..."
done

分割+forループとは大きく異なりますが、入力要素自体にスペースやワイルドカードを含めることができる場合は、より安全です。

おすすめ記事