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

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

私はエラー処理を比較するために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

関連情報