
条件付きで終わるいくつかのコマンドがパイプを介して接続されていますawk
。以下の例
command1 | command 2 | awk '$1 > 800'
今では、時には数行を出力し、時には出力しません。一部の出力(1行以上)がある場合にのみtrueと証明される条件が必要です。これを機能させる方法はありますか?
良い、
if command1 | command 2 | awk '$1 > 800' (some output); then
do command3
else; (blank output)
Do nothing
答え1
普段はただ使うコマンドの置き換えその後、テストに入れます。
if [ ! -z "$(command1 | command 2 | awk '$1 > 800')" ]; then command3; fi
説明する
- あなたの質問に従ってコマンドが実行されます。
command1 | command 2 | awk '$1 > 800'
- 出力はtestに渡され、長さ0の文字列で
[ ! -z "$(…)" ]
ない場合はtrueと評価されます。!
-z
したがって、コマンドパイプラインの出力がある場合、then
コマンドは実行されます。
答え2
awk
ステートメントの正しい戻りコードを使用してスクリプトを終了しますif
。
if command1 | command2 | awk '$1 > 800 { c++; print } END { exit (c == 0) }'
then
command3
fi
または実際にそうしない場合必要プログラム出力awk
:
if command1 | command2 | awk '$1 > 800 { c++; exit } END { exit (c == 0) }'
then
command3
fi
答え3
awk
次のように目的の終了コードを印刷できます。
echo 900 | awk '{ print !($1 > 800) }'
(
その後、およびを使用してサブシェルにラップしてexit
値を返すことができますawk
。
echo 900 | (exit $(awk '{ print !($1 > 800) }'))
その後、パイプラインの一部として使用できます。
echo 900 | (exit $(awk '{ print !($1 > 800) }')) && echo yes || echo no