반환된 결과를 확인하는 가장 좋은 방법은 무엇입니까?

반환된 결과를 확인하는 가장 좋은 방법은 무엇입니까?

폴더가 있는지 확인하는 쉘 스크립트에 함수가 설정되어 있습니다. 그렇지 않은 경우 폴더를 생성하려고 시도하고 폴더를 생성할 수 없는 경우(예: 사용자에게 올바른 권한이 없는 경우) 1을 반환한 다음 이것을 확인합니다. "return"이지만 return이 1이기 때문에 "if"가 작동하지 않는 이유를 이해할 수 없습니다.

암호:

#!/bin/bash
# Main folders
INPUT="input"
OUTPUT="output"

# Functions

function checkFolderExist(){
    if [ -d $1 ]
    then
        # 0 = true
        # Change to 0, only for tests.
        return 1
    else
        mkdir $1
        result=$?
        if [ result==0 ]
        then
            # 0 = true
            return 0
        else
            # 1 = false
            return 1
        fi
    fi
}


CHECKINPUT=$(checkFolderExist $INPUT)
echo $?
CHECKOUTPUT=$(checkFolderExist $OUTPUT)
echo $?

# If folders does not exist, exit the script
if [[ "$CHECKINPUT" = 1 || "$CHECKOUTPUT" = 1 ]]; then
    echo "[+] Error. Folder does not exist. Check user permissions."
    exit 1
fi

답변1

다음은 몇 가지 사항입니다.

  • 희귀한$?동일한 종료 상태를 여러 번 참조해야 하는 경우를 제외하고 모든 항목을 명시적으로 확인하거나 변수에 저장 해야 합니다 .
  • 함수의 종료 상태는 함수에서 실행된 마지막 명령의 상태이므로 return명시적인 종료가 거의 필요하지 않습니다(명시적인 반환이 있는 경우는 거의 없음).적어도).
  • 디렉터리가 존재하는지 확인하는 함수는 디렉터리를 생성해서는 안 됩니다. 더 나은 전화 create_dir_if_needed.
  • 에 오류가 있습니다 [ result==0 ]. 문자열은 result==0길이가 0이 아닌 문자열입니다. 이 방법으로 문자열을 테스트하면 반환됩니다.진짜문자열 길이가 0이 아닌 경우 테스트는 항상 참입니다. 당신이 원하는 것은 아마도 것 [ "$result" -eq 0 ]입니다.
  • 어떤 상황인지 알지 못하는 한 변수 확장 및 명령 대체에는 항상 큰따옴표를 사용해야 합니다.이는 필수 사항이 아닙니다..

다음 사항을 고려하십시오.

create_dir_if_needed () {
    mkdir -p -- "$1"
}

그러면 종료 상태가 반환됩니다 mkdir -p -- "$1". 이 명령은 지정된 디렉터리(및 중간 디렉터리)가 아직 없는 경우 생성합니다. mkdir명령이 디렉터리 생성에 실패 하면 0이 아닌 종료 상태로 종료되며, 이는 함수의 종료 상태가 됩니다. mkdir -p디렉터리가 이미 존재하는 경우에는 실패하지 않습니다.

다음과 같이 사용할 수 있습니다.

if ! create_dir_if_needed "$dirpath"; then
    printf 'Failed to create directory "%s"\n' "$dirpath" >&2
    exit 1
fi

혹은 기능이 간단하기 때문에 없애고 말씀하셔도 됩니다.

if ! mkdir -p -- "$dirpath"; then
    printf 'Failed to create directory "%s"\n' "$dirpath" >&2
    exit 1
fi

이 함수의 변형은 주어진 디렉터리 경로에 대해 누락된 상위 디렉터리가 생성되지 않도록 하기 위해 없이를 create_dir_if_needed사용합니다 .mkdir-p

create_dir_if_needed () {
    if [ -d "$1" ]; then
        return
    fi

    mkdir -- "$1"
}

또는,

create_dir_if_needed () {
    [ -d "$1" ] || mkdir -- "$1"
}

이 함수를 호출하면 반환됩니다.진짜(영) 디렉터리가 이미 존재하거나 호출이 mkdir성공한 경우입니다. 명시적인 값이 없는 문은 return가장 최근에 실행된 문의 종료 상태를 반환하며, 이 경우 긍정적인 테스트 결과를 반환합니다 [ -d "$1" ].

답변2

Bash는 반환 값에 있어서 일반 프로그래밍 언어와 다릅니다.

여기서 헷갈리시죠산출checkFolderExist에서반품 상태checkFolderExist에서.

함수 echo에 아무것도 없기 때문에 CHECKINPUT 및 CHECKOUTPUT 변수는 비어 있습니다 printf.

정말로 기능을 저장하고 싶다면반품 상태나중에 사용하려면 다음을 수행해야 합니다.

checkFolderExist "${INPUT}"
CHECKINPUT=$?

checkFolderExist "${OUTPUT}"
CHECKOUTPUT=$?

그 외에도 어쨌든 다음 조언을 따르는 것이 좋습니다.코살로난다의 답변문제를 해결하기 위한 더 나은 기술을 안내합니다.

답변3

함수의 출력과 반환 값을 혼동하고 있습니다. 오류를 확인할 수 있도록 최소한의 실제 예제를 보여드리겠습니다.

반환:

myfunc() {
  return 1
}

myfunc
ret=$?
[ $ret -eq 0 ] && echo OK

또는 표준 출력에 쓰고 출력을 확인합니다.

myfunc() {
  echo '1'
}

ret="$(myfunc)"
[ "$ret" = '0' ] && echo OK

또한 나는 변수에 대해 정수와 문자열을 구별하는 것을 선호하는데 ret, 출력이 숫자일 뿐이라는 것을 알고 있다면 더 명확하게 하기 위해 실제로는 필요하지 않습니다. 또한 조건문이 뒤에 오는 경우 반환 값을 변수에 캡처할 필요가 없습니다.

이것이 원하는 첫 번째 항목이므로 사용할 수 없습니다 $(). 두 항목을 함께 혼합하면 첫 번째 예와 같이 값을 반환하고 두 번째 예와 같이 출력을 확인합니다.

관련 정보