"GNU bash, 버전 4.2"이전의 Bash 버전 -v
의 경우 test
명령 옵션에 대한 동등한 대안이 있습니까? 예를 들면 다음과 같습니다.
shopt -os nounset
test -v foobar && echo foo || echo bar
# Output: bar
foobar=
test -v foobar && echo foo || echo bar
# Output: foo
"GNU bash, 버전 4.2"이전의 Bash 버전 -v
의 경우 test
명령 옵션에 대한 동등한 대안이 있습니까? 예를 들면 다음과 같습니다.
shopt -os nounset
test -v foobar && echo foo || echo bar
# Output: bar
foobar=
test -v foobar && echo foo || echo bar
# Output: foo
답변:
모든 POSIX 쉘에 이식 가능 :
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
확인 ${foobar:+1}
당신이 취급 할 경우 foobar
같은 방식으로 비어 여부를 정의인지. 정의되지 않은 경우 및 그렇지 않은 ${foobar-}
경우 빈 문자열을 얻는 데 사용할 수도 있습니다 (또는 뒤에 다른 기본값을 넣습니다 ).foobar
foobar
-
ksh에서 if foobar
와 같이 선언되었지만 정의되지 않은 경우 빈 문자열 typeset -a foobar
로 ${foobar+1}
확장됩니다.
Zsh에는 선언되었지만 설정되지 않은 변수가 없습니다 typeset -a foobar
. 빈 배열을 만듭니다.
bash에서 배열은 다른 놀라운 방식으로 동작합니다. 비어 있지 않은 배열 인 경우 ${a+1}
에만 확장1
a
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
동일한 배열이 연관 배열에 적용됩니다. 배열 변수는 비어 있지 않은 인덱스 집합이있는 경우 정의 된대로 처리됩니다.
모든 유형의 변수가 정의되었는지 여부를 테스트하는 다른 bash 특정 방법은에 나열되어 있는지 확인하는 것입니다 . 이렇게하면 빈 배열이 정의 된대로 보고되지만 선언되었지만 할당되지 않은 변수 ( )는 정의되지 않은 것으로보고합니다.${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
이는 선언되었지만 할당되지 않은 변수에서 실패하는 것을 제외하고 또는 의 반환 값typeset -p foobar
declare -p foobar
을 테스트하는 것과 같습니다 typeset -p foobar
.
ksh에서와 같이 bash에서는 set -o nounset; typeset -a foobar; echo $foobar
정의되지 않은 변수를 확장하려는 시도에서 오류가 발생합니다 foobar
. ksh와 달리 set -o nounset; foobar=(); echo $foobar
(또는 echo "${foobar[@]}"
)도 오류를 트리거합니다.
여기에 설명 된 모든 상황에서 아래에 오류가 발생하는 ${foobar+1}
경우에만 빈 문자열로 확장 $foobar
됩니다 set -o nounset
.
echo "${foobar:+1}"
인쇄되지 않으므로 인덱스 배열입니다. 올바르게보고합니다 . 비 배열 변수에만 작동 합니까 ? 1
declare -a foobar
foobar
declare -p foobar
declare -a foobar='()'
"${foobar:+1}"
${foobar+1}
( :
, 내 원래 답변에 두 가지 예를 거꾸로 뒤집어 놓았습니다 )가 bash의 배열에 적합합니다 . 정의가 다르면 bash는 약간 이상합니다. 업데이트 된 답변을 참조하십시오. $foobar
set -o nounset
0
가 그렇듯이 인덱스 나 키가 정의되고 a=()
, ${a+1}
올바르게 아무 것도 반환하지 않습니다.
defined
운영자가 있습니다. 그것을 Test
할 수 있었다 ; 그것은 (어려울 수 없습니다 음 ....)
bash의 모든 변수에 동일한 기술을 사용하며 다음과 같이 작동합니다.
[ ${foobar} ] && echo "foobar is set" || echo "foobar is unset"
출력 :
foobar is unset
...하는 동안
foobar=( "val" "val2" )
[ ${foobar} ] && echo "foobar is set" || echo "foobar is unset"
출력 :
foobar is set
foobar=""
그런 다음보고합니다 foobar is unset
. 잠깐만 요. 실제로 첫 번째 요소가 비어 있는지 여부를 테스트하기 때문에 변수가 배열이 아니라는 것을 알고 정의가 아닌 공허함 만 신경 쓰면 좋은 생각 인 것 같습니다.
-v
의 옵션이test
아니라 조건식 연산자입니다.