변수 값 일치 및 기본값 설정

변수 값 일치 및 기본값 설정

어떤 값이든 사용할 수 있는 변수가 있습니다 "SUBSCRIPT"."ITERATE""COUNTER"

이들 중 하나에서 변수를 테스트하고 "SUBSCRIPT"일치하지 않는 경우 기본값으로 설정하려면 어떻게 해야 합니까?

나는 컴팩트 한 형태를 원했고 다음과 같이 생각해 냈습니다.

  [[ "${signal}" == "SUBSCRIPT" || "${signal}" == "ITERATE" ||
     "${signal}" == "COUNTER" ]] || signal="SUBSCRIPT"

앞서 언급한 작업이 실패할까요?

답변1

귀하의 코드는일하다, 동일한 유형의 작업을 작성하는 몇 가지 깔끔한 방법이 있습니다.

첫 번째 방법은 모든 POSIX 셸에서 작동하며 표준 case문을 사용합니다.

case $signal in
    SUBSCRIPT|ITERATE|COUNTER)
        # do nothing
        ;;
    *)
        signal=SUBSCRIPT
esac

이 명령문은 세 가지 값 중 하나 또는 가 이미 있는 경우를 제외하고 case변수 값을 문자열로 설정합니다 .SUBSCRIPTSUBSCRIPTITERATECOUNTER

다음과 같이 한 줄에 작성할 수 있습니다.

case $signal in (SUBSCRIPT|ITERATE|COUNTER) ;; (*) signal=SUBSCRIPT; esac

if다음에서 보다 간결한 명령문을 사용할 수도 있습니다 bash.

if [[ $signal != @(SUBSCRIPT|ITERATE|COUNTER) ]]; then
    signal=SUBSCRIPT
fi

또는 해당하는 경우 단락 평가를 사용합니다.

[[ $signal == @(SUBSCRIPT|ITERATE|COUNTER) ]] || signal=SUBSCRIPT

이는 확장된 글로빙 패턴을 사용하여 변수 값이 언급된 세 가지 값 중 하나와 일치하는지 테스트합니다(구문은 쉘에서 상속됨 ksh). 그 경우아니요match (테스트는 코드의 첫 번째 변형에서 반대입니다. ||두 번째 변형에서 사용합니다), 변수 값은 string 으로 재설정됩니다 SUBSCRIPT.

답변2

세 개의 유효한 값에 대해서만 기존 답변이 좋은 방법을 제공합니다. 숫자가 증가하면 다음과 같은 방법이 유용할 수 있습니다.

signal=foo
default='SUBSCRIPT'
if [ -n "$signal" ]; then
    valid_values=(
        SUBSCRIPT ITERATE COUNTER
    )

    declare -A tmpar=()
    for str in "${valid_values=[@]}"; do
        tmpar[$str]=1
    done
    test -n "${tmpar["$signal"]}" || signal="$default"
else
    signal="$default"
fi

답변3

SUBSCRIPT설정되지 않거나 비어 있을 때 변수에 다음 값이 할당되기를 원하는 경우:

ITERATE=${ITERATE:-$SUBSCRIPT}

관련 정보