
このスクリプトは機能します。
$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ループとは大きく異なりますが、入力要素自体にスペースやワイルドカードを含めることができる場合は、より安全です。
答え2
プレーンテキスト操作に必要なPOSIXツール(つまり、すべてのUnixシステムで利用可能)はですawk
。 awkを使用してください。
$ awk -F'=' '$2 ~ /^192\.[34]\./{f=1; print $2} END{ if (!f) print "no IP found"; exit !f }' list
192.3.xx.xx
192.4.xx.xx
$ awk -F'=' '$2 ~ /^192\.[8]\./{f=1; print $2} END{ if (!f) print "no IP found"; exit !f }' list
no IP found
言及する他のもの:
egrep
約20年前には廃止されました。代わりにgrep -E
使用しないでください。- @ChrisDaviesのコメントが問題であることを理解していないようです。彼は指摘したあなたの質問にまだ存在します。
cat list | cut -d= -f2
は連合大学または必要がありcut -d= -f2 list
、cut -d= -f2 < list
必要に応じて可能性があります<list cut -d= -f2
。echo $i
echo "$i"
(参照https://mywiki.wooledge.org/Quotes)。- 常にコードを実行してください。http://shellcheck.netシェルにもっと慣れるまで。