programing

설정 해제 vs. 변수를 비워 두도록 설정

closeapi 2023. 4. 21. 20:52
반응형

설정 해제 vs. 변수를 비워 두도록 설정

저는 현재 bash 테스트 프레임워크를 작성하고 있습니다.테스트 기능에서는 양쪽 표준 bash 테스트([[)와 함께 사전 정의된 매처도 사용할 수 있습니다.Matchers는 '[[]'의 래퍼이며 반환 코드를 반환하는 것 외에 무엇을 예상했는지를 나타내는 의미 있는 메시지를 설정합니다.

예:

string_equals() {
    if [[ ! $1 = $2 ]]; then
            error_message="Expected '$1' to be '$2'."

            return 1
    fi
}

따라서 매처가 사용되었지만 실패하면 error_message만 설정됩니다.

이제, 어느 시점에서, 저는 테스트가 성공했는지 테스트합니다.성공했을 경우는 녹색으로, 실패했을 경우는 빨간색으로 인쇄합니다.

또한 error_message 세트가 있을 수 있으므로 메시지가 존재하는지 테스트하고 인쇄한 후 설정을 해제합니다(다음 테스트에서는 메시지가 설정되지 않을 수 있습니다).error_message):

if [[ $error_message ]]; then
    printf '%s\n' "$error_message"

    unset -v error_message
fi

여기서 궁금한 것은 변수를 설정 해제하는 것이 좋은지 아니면 그냥 ''로 설정하는 것이 좋은지입니다.

error_message=''

어떤 게 더 나아요?그게 실제로 차이를 만들까요?아니면 메시지가 설정되었음을 나타내는 플래그를 추가해야 할 수도 있습니다.

대부분의 경우 다른 점은 없습니다.set -u:

/home/user1> var=""
/home/user1> echo $var

/home/user1> set -u
/home/user1> echo $var

/home/user1> unset var
/home/user1> echo $var
-bash: var: unbound variable

따라서 변수를 어떻게 테스트하느냐에 따라 달라집니다.

설정이 되어 있는 경우는, 이하의 방법으로 테스트하는 것을 추천합니다.

[[ -n $var ]]  # True if the length of $var is non-zero

또는

[[ -z $var ]]  # True if zero length

전술한 바와 같이 unset를 사용하는 것은 어레이에서도 다릅니다.

$ foo=(4 5 6)

$ foo[2]=

$ echo ${#foo[*]}
3

$ unset foo[2]

$ echo ${#foo[*]}
2

따라서 어레이 인덱스 2를 설정 해제하면 어레이에서 해당 요소를 제거하고 어레이 크기(?)를 줄일 수 있습니다.

내가 직접 테스트를 해봤는데..

foo=(5 6 8)
echo ${#foo[*]}
unset foo
echo ${#foo[*]}

그 결과..

3
0

따라서 어레이 전체를 설정 해제하면 어레이가 완전히 삭제됩니다.

위의 코멘트를 바탕으로 간단한 테스트를 실시합니다.

isunset() { [[ "${!1}" != 'x' ]] && [[ "${!1-x}" == 'x' ]] && echo 1; }
isset()   { [ -z "$(isunset "$1")" ] && echo 1; }

예:

$ unset foo; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's unset
$ foo=     ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set
$ foo=bar  ; [[ $(isunset foo) ]] && echo "It's unset" || echo "It's set"
It's set

언급URL : https://stackoverflow.com/questions/12262696/using-unset-vs-setting-a-variable-to-empty

반응형