エラーコードまたはawkスクリプトの終了ステータスをシェルに読み込んで、シェルスクリプトのエラー処理を比較するif条件で使用したいのですが、次のようになります。
私のスクリプト:
#!/bin/sh
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk
echo $? # prints the error code '2' in this case, if the file is actually not available
recval = $?
if ($recval == '$2') **//this condition statement doesn't seems to work.**
then
echo "Some error"
fi
test.awkファイル:
BEGIN {
ignore_line = 0;
if ( CONFIG_SOURCE == "" )
{
print "Error: Invalid embed source file.";
exit 1
}
if ( 0 != system( "[ -f " CONFIG_SOURCE " ] " ) )
{
print "Error: Embed source file '" CONFIG_SOURCE "' does not exist."
exit 2
}
}
したがって、ファイルが使用できない場合は、終了ステータス「2」が返されます。これはエコーできますが、値「2」または終了ステータスをシェルの変数(recval)にコピーする方法)
これは機能するはずです:
#!/bin/sh
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk
re=$?
echo "$re"
if [ "$re" -eq 2 ]; then
echo >&2 "Some error"
fi
スクリプトの問題は、echo $?
の前にrecval = $?
が使用されていることでした。 echo $?
を使用して、$?
(最後のステートメントの終了ステータス)の値を出力しました。しかしその後、$?
はecho $?
から上書きされました。最後のステートメントの終了ステータスは、echo $?
の終了ステータスであり、おそらく0でした。
$?
には、実行されたまさに最後のコマンドの終了コードの値が含まれます。 caseステートメントで終了コードをスタックすることもできます。
#!/usr/bin/env bash
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk &> /dev/null
recval=$?
case $recval in
0) echo "Exit code 0"
;;
1) echo "Exit code 1"
;;
2) echo "Exit code 2"
;;
esac