스크립트로 종료 코드 읽기

스크립트로 종료 코드 읽기

테스트해야 하는 일부 매개변수에 대한 종료 코드를 찾기 위해 이 스크립트를 만들었습니다. 이제 종료 코드를 확인하기 위해 이 스크립트를 호출하는 두 번째 스크립트를 만들어야 합니다. 그러나 두 번째 스크립트는 이 스크립트의 종료 코드를 읽은 다음 텍스트를 할당해야 합니다.

예:

통과 /etc/resolve.conf한 후 다음을 사용하여 echo $?돌아옵니다 .0

이제 나는 found file에코 같은 것을 원합니다.

종료 코드를 찾는 첫 번째 스크립트입니다.

#/bin/bash
shopt -s -o nounset

if [ $# != 1 ]; then
    exit 2
fi

if [[ ${1:0:1} = /* ]]; then
    :
else
    exit 3
fi

if [ -f ${1} ]; then
    exit 0
else
    exit 1
fi

이것이 내 두 번째 스크립트가 있는 곳입니다. ./script1.sh를 호출한 후 종료 코드 0을 = text로 설정하는 방법을 이해할 수 없습니다.

#/bin/bash
shopt -s -o nounset
./script1.sh

이 예제처럼 script1에 echo를 포함하는 것이 더 쉬울 것이라는 것을 알고 있지만 이 경우 두 번째 파일에서 읽어야 합니다.

if [ -f ${1} ]; then
    echo "file found"
    exit 0
else
    echo "file not found"
    exit 1
fi

답변1

전화하신 전화번호 script1.sh는 다음과 같습니다.

./script1.sh

호출된 후 스크립트의 종료 코드는 $?.

그러나 인수 없이 스크립트를 호출하면 스크립트 헤더에서 인수 수를 테스트하고 정확히 1이 아닌 한 오류 코드 2로 종료됩니다. 이는 귀하의 의견에서 언급한 동작과 일치합니다.

if [ $# != 1 ]; then
    exit 2
fi

전화를 걸어 script1.sh몇 가지 주장을 제기할 수도 있습니다. 기본 스크립트에서 받은 매개변수를 전달하려면 다음을 사용하세요.

./script1.sh "$@"   # pass all arguments

또는

./script1.sh "$1"   # pass the first argument

(후자는 기본 스크립트에 인수가 제공되지 않더라도 빈 문자열을 전달하지만)


사소한 문제로 변수 확장을 인용해야 합니다(예: "$#"대신 $#또는 대신 "${1}") . 그렇지 않으면 파일 이름에 공백이 포함되어 있거나 스크립트가 시작될 때 이상한 값으로 설정되어 있어도 스크립트가 실패합니다 ."$1"${1}$#IFS

또한 대신

if something; then
    :
else
    exit 3
fi

당신은 쓸 수 있습니다

if ! something; then
    exit 3
fi

답변2

이것이 두 번째 스크립트라고 가정해 보겠습니다.

#/bin/bash
shopt -s -o nounset
./script1.sh
result=$?
echo $result

변수에 할당하는 이유는 향후 처리를 위해 저장하기 때문입니다. 호출하면 $?다른 프로그램과 관련이 있을 것입니다.

$?이전 스크립트가 반환한 내용은 다음과 같습니다 .

관련 정보