awkとgrepの終了状態の問題

1885 ワード

この時間は仕事でshellスクリプトを使う必要があります.簡単に見て、ifでawkとgrepを使いました.以下のようにします.
 
#!/bin/sh
# TestIf.sh
# if 

# grep 
if echo "hello world" | grep "hi" > /dev/null 2>&1
then
    echo "hi in string!"
else
    echo "hi out string!"
fi

# awk 
if echo "hello world" | awk '$1 == "hi"' > /dev/null 2>&1
then
    echo "hi in string!"
else
    echo "hi out string!"
fi

 
次のように動作します.
        hi out string!         hi in string!
 
戻り状態が予期した結果に達しないと推測し、以下のテストを行った.
 
#!/bin/sh
# ReturnValue.sh
#  

#  awk 
echo "hello world" | awk '$1 == "hello" {print $1}'
echo "$?"

echo "hello world" | awk '$1 == "oo" {print $1}'
echo "$?"

#  grep 
echo "hello world" | grep "hello"
echo "$?"

echo "hello world" | grep "oo"
echo "$?"

#  
echo "hello world" | awk '$1 == "hello" {print $1} {exit 45}'
echo "$?"

 
次のように動作します.
hello 0 0 hello world 0 1 hello 45
やはり脱退状態が原因であることを証明します.
 
Linux状態では、コマンドの実行が完了するたびに、システムは終了状態に戻ります.この終了状態は、コマンドの実行が正しいかどうかを判断するための整数値で表されます.終了ステータスが0の場合、コマンドが正常に実行されたことを示します.終了ステータス値が0でない場合は、コマンドの実行に失敗します.最後の実行コマンドの終了ステータス値は、組み込み変数「$?」に保存されます.で、コマンドが正常に実行されたかどうかをecho文でテストできます.
man grepの時こんな一節を発見した:Normally,exit status is 0 if selected lines are found and 1 otherwise.もともとgrepを使用する場合、一致する任意の行が見つかり、終了状態は0であり、そうでない場合は1である.しかしawkはそうではありません.資料を調べた結果、以下のようにまとめた.
簡単に言えばgrepは、コマンドラインの戻り値が検索に成功したかどうかを示す小さなツールです.awk/perlはsedさえスクリプト言語と呼ぶべきで、戻り値はスクリプト実行の結果を表す.2番目のセグメントコードの最後の例のようにawkの戻り値を任意に定義することができ、任意の整数値を返すことができますが、unix環境での習慣に従ったほうがいいです.0は正常で、0ではなくエラーを表します.
リファレンスhttp://bbs.chinaunix.net/thread-1430016-3-1.html