bashの$?を使ってみよう

bashでコマンドの実行結果を取得するには、$?を使います。

たとえば次のようなログファイルが3つあるとします。「ERROR AAAA」を含むログだけ検出するためにはどうすれば良いでしょう。

$ cat log1.txt
ERROR AAAA
ERROR BBBB

$ cat log2.txt
ERROR CCCC
ERROR BBBB

$ cat log3.txt
AAA
BBB
CCC

次のようなgrep-pipeline.shを用意します。grepコマンドをパイプラインでつなげて実行しています。$?をresult変数へ代入して、echoでresultの値を表示することにより、このコマンドの結果がどうなったかをわかるようにしています。

$ cat grep-pipeline.sh 
#!/bin/sh
grep "ERROR" $1 | grep "AAAA"
result=$?
echo $result;

各ログファイルのうちヒットするのは、log1.txtだけのはずです。$?の結果がどのようになるかを見てみましょう。

$ for i in 1 2 3; do echo "$i----"; ./grep-pipeline.sh log${i}.txt; done
1----
ERROR AAAA
0
2----
1
3----
1

確かに、「ERROR AAAA」を含むログファイルだけ$?の値が0となって判別がつくことがわかります。

同じタグの記事: bash
同じタグの記事: Linux
同じカテゴリの記事: Linux
関連書籍: bash