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 $?0일 수 있습니다.

답변2

기본 논리는 정확하지만 쉘 구문이 잘못되었습니다.

  • 할당은 등호 주위에 공백이 없는 단일 단어여야 합니다. recval = $?두 개의 인수 및 을 사용하여 명령을 실행합니다.recval=$?
  • 명령 뒤의 $?값은 $?해당 echo명령입니다. $?다른 변수에 저장하는 것이 가장 먼저 수행되어야 합니다. 쉘 스크립트가 수행하는 작업을 보려면 추적을 인쇄하십시오. 행 아래 set -x상단에 추가하십시오.#!
  • '$2'2문자 문자열입니다. 숫자 2에는 을 쓰세요 2. 그러나 오류가 있는지 테스트하려면 상태가 0이 아닌지 테스트하세요. 2는 가능한 값 중 하나일 뿐입니다.
  • 정수를 비교하는 방법은 여러 가지가 있지만 작성한 내용은 하나가 아닙니다.
    • [ "$x" -eq "$y" ](가지고 다닐 수 있는)
    • [[ $x -eq $y ]](ksh, bash, zsh에서만 가능하지만 ksh에서는 불가능 /bin/sh)
    • ((x == y))(ksh93, bash, zsh에서만 가능하지만 에서는 불가능 /bin/sh)
  • 오류 메시지는 표준 출력 대신 표준 오류(파일 설명자 2)로 이동합니다.
  • awk가 실패하면 스크립트는 0이 아닌 상태를 반환해야 합니다.

수정된 스크립트는 다음과 같습니다.

#!/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

관련 정보