私はエラー処理を比較するためにif条件で使用するために、awkスクリプトのエラーコードまたは終了ステータスをシェルに読み込みたいと思います。私のシェルスクリプトは次のとおりです。
私のスクリプト:
#!/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
.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)
答え1
これは働きます:
#!/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 $?
beforeを使用することですrecval = $?
。 (最後の問い合わせ終了ステータス)echo $?
値を印刷すると、$?
しかし、それから$?
カバーしましたecho $?
。最後のステートメントの終了状態はの終了状態であり、ゼロにすることができますecho $?
。
答え2
デフォルトのロジックは正確ですが、シェル構文が正しくありません。
- 割り当ては、等号の周りにスペースがない単一の単語でなければなりません。
recval = $?
2つの引数とを使用してコマンドを実行します。recval
=
$?
- コマンドの後の
$?
値は対応$?
するecho
コマンドです。$?
他の変数に保存することは最初に行う必要があります。シェル・スクリプトが実行するアクションを表示するには、トレースを印刷します。行の下set -x
の上部に追加します。#!
'$2'
2文字の文字列です。数字2にはを書いてください2
。ただし、エラーがあるかどうかをテストするには、ステータスがゼロでないことをテストしてください。 2は可能な値の1つにすぎません。- 整数を比較する方法はいくつかありますが、作成したものは1つではありません。
[ "$x" -eq "$y" ]
(持ち歩ける)[[ $x -eq $y ]]
(ksh、bash、zshでのみ可能ですが、kshでは不可能です/bin/sh
)((x == y))
(ksh93、bash、zshでのみ可能ですが、では不可能/bin/sh
)
- エラーメッセージは、標準出力ではなく標準エラー(ファイル記述子2)に移動します。
- awkが失敗した場合、スクリプトはゼロ以外の状態を返す必要があります。
変更されたスクリプトは次のとおりです。
#!/bin/sh
awk -v CONFIG_SOURCE=Testfile1.txt -f test.awk
awk_status=$?
if [ "$awk_status" -eq 2 ]; then
echo 1>&2 "Additional information regarding the error message from awk just above"
exit $awk_status
fi
答え3
$?
異常終了コードを含む値最後のコマンド処刑される。 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