wc -l | test -eq 1
これは機能しません。wcの結果を値1と比較したいのですが、どうすればよいですか。
wc -l | test -eq 1
これは機能しません。wcの結果を値1と比較したいのですが、どうすればよいですか。
回答:
パイプについての質問には答えませんが、次のように並べ替えることができます。
test $(ls -l | wc -l) -eq 1 && echo "worked"
SOにはいくつかの解決策がありますが、これが最も優れています。
ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }
Bashを使用している場合は、おそらくPIPESTATUS変数を調査する必要があります。Bashリファレンスガイドに記載されているように、PIPESTATUSは
最近実行されたフォアグラウンドパイプライン(単一のコマンドのみを含む場合がある)のプロセスからの終了ステータス値のリストを含む配列変数(配列を参照)。
PIPESTATUSを使用して、このパイプラインの終了コードを確認できます。
dmesg | grep -iw 'nnse' | wc -l
ここで配列変数をクエリすると、パイプラインで使用されるコマンドを参照する終了ステータスが取得されます。
echo ${PIPESTATUS[@]}
0 1 0
(インデックス付き配列では、配列は常にBashで0から始まるため、上記の終了コードは配列の0 1および2で表されます。)
ここでは、2番目のコマンドが1を返し、残りが0を返します。ただし、wc -l
一致がゼロの場合は0を返します。これはエラーではありません。失敗はゼロ以外の値で表され、コマンドが見つからない127などのエラー値や、関連するプログラムに固有のコードがさらに存在する場合があります。
パイプライン内の特定のコマンドの終了コードを確認したい場合は、その値にアクセスできます。grepコマンドは上記のパイプラインの2番目のコマンドですが、配列が0から始まるため、エントリ1が必要です。
したがって、grepコマンドの終了コードを確認するには、上記のパイプラインを再度実行し(を実行するとPIPESTATUSの内容が使い果たされるためecho ${PIPESTATUS[@]}
)、次のコマンドを実行すると1(終了コード)が返されます。
echo ${PIPESTATUS[1]}
1
スクリプトでは、PIPESTATUS配列変数の内容を探す前に、パイプラインの実行が完了していることを確認してください。
PIPESTATUS配列変数の興味深い使用例については、Bashコマンドのグループ化とパイプステータスの組み合わせに関するこの回答を参照してください。最初にパイプラインを再度実行する必要がありますが、コメントでGillesが提案した方法で配列変数をテストできます。
dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here
あなたがどのようなスクリプトを意図しているのかわからないので、これは単なる断片ですが、PIPESTATUSについて知っておくと役立つかもしれません。PIPESTATUSのように、非常に役立つ多くのBash配列変数があります。リスト全体についてはBashリファレンスガイドを、使用例については他のStackexchangeサイトをご覧ください。
これは、すべてカバーしていないtest
場合は、しかし、あなたは、正規表現、および使用できるかどうかgrep
パイプで連結された文字列をするので、それはかなりまっすぐ進むのですgrep
あるtest
一致が見つからないとき、それは非ゼロの終了を持っていることで様
cat file | wc -l | grep -qE '^\s*1\s*$'
拡張正規表現を使用すると、この手法で多くのケースをカバーできます。笑い声の場合、テストケース:
for i in 1 11 '' foo; do
if echo $i | grep -qE '^\s*1\s*$'; then
echo "'$i' matched"
else
echo "'$i' didn't match."
fi
done
出力:
'1' matched
'11' didn't match.
'' didn't match.
'foo' didn't match.