변수가 설정되었는지 테스트하기 위해 버전 4.2에 도입된 단항 연산자는 -v
bash 4.3.46의 연관 배열에서 작동하지 않는 것으로 보입니다.
나는 bash 함수 세트에 대해 실행하는 bash 테스트 코드를 가지고 있으며 모두 bash 4.2(CentOS 7.1)에서 전달됩니다. 최근 Lubuntu 16.04.1 배포판을 부팅했는데 대부분의 테스트가 bash 4.3.46에서 실패하는 것을 확인했습니다. 모든 실패는 다음과 같은 코드로 인해 발생하는 것 같습니다.
function is_var_set {
local var="${1:?"No var provided to 'is_var_set'!"}"
[[ -v "$var" ]]
}
declare -A array=(["a"]="element 1")
is_var_set "array"
이것이 알려진 사실입니까/연관 배열에 대한 지원이 제거되었습니까?
답변1
현재의Bash 배열 매뉴얼설명하다
아래 첨자가 할당된 경우 배열 변수는 설정된 것으로 간주됩니다.
그래서 IMHO 연관 배열을 사용하면 뭔가 다른 작업을 수행해야 합니다. 이것이 최근 bash 동작의 변화인지 알 수 없습니다.
그것을 정의하는 또 다른 방법 is_var_set
은 (ab)를 사용하는 것입니다.declare
내장, 다음을 사용하십시오.
이름 중 하나가 유효한 쉘 변수 이름이 아닌 경우를 제외하면 반환 상태는 0입니다...
function is_var_set {
declare -p "${1:?"No var provided to 'is_var_set'! "}" &> /dev/null
}
위의 내용은 최상위 변수 이름에는 적용되지만 특정 배열 요소에는 적용되지 않습니다.
답변2
Bash 버전 4.3.46오직 (이전 버전(4.2)은 이 구문을 이해하지 못하며 새 버전에는 이 문제가 없습니다.)
요소 0뿐만 아니라 배열도 테스트해야 합니다.
[[ -v array[@] ]]
실패합니다.
$ declare -A array=(["a"]="element 1")
$ declare -p array
declare -A array=([a]="element 1" )
$ [[ -v array ]] && echo yes # nothing is printed.
하지만 이것은 작동합니다:
$ [[ -v array[@] ]] && echo yes
yes
따라서 기능을 다음과 같이 변경하십시오.
function is_var_set {
local avar="${1:?"No var provided to 'is_var_set'!"}[@]"
[[ -v "$avar" ]]
}
이 스크립트를 사용하여 다음을 테스트하세요.
function is_var_set {
local avar="${1:?"No var provided to 'is_var_set'!"}[@]"
[[ -v "$avar" ]] && echo "$1 set: yes" || echo "$1 set: no"
echo
}
var=wer
echo "array scalar $(declare -p var)"
is_var_set var
var=( foo bar baz )
echo "var indexed array $(declare -p var)"
is_var_set var
unset var
echo "var associative array $(declare -p var)"
is_var_set var
declare -A var=(["a"]="element 1")
echo "var associative array $(declare -p var)"
is_var_set var
declare -A var=(["a"]="")
echo "var associative array $(declare -p var)"
is_var_set var