어떤 값이든 사용할 수 있는 변수가 있습니다 "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
변수 값을 문자열로 설정합니다 .SUBSCRIPT
SUBSCRIPT
ITERATE
COUNTER
다음과 같이 한 줄에 작성할 수 있습니다.
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}