web-dev-qa-db-ja.com

比較するifステートメントで使用されるAWKスクリプトからシェルスクリプト(bash)に戻り値(終了ステータス)をコピーまたは読み取る方法

エラーコードまたは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)にコピーする方法)

2
user68039

これは機能するはずです:

#!/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でした。

3
chaos

$?には、実行されたまさに最後のコマンドの終了コードの値が含まれます。 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
0
Christopher