오류 처리를 비교하기 위해 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