내가보고 있어요이것하지만 변수 이름을 하드코딩하지 않는 내 경우에 맞게 조정하려고 합니다. 사실 논리를 합치고 있는데내 이전 질문.
이 같은:
shopt -s extglob
export var=abc_def__123__456
echo ${var/%__*}
# does this variable (abc_def) exist?
echo This is not valid syntax: [ -z ${${var/%__*}+x} ] && echo ${var/%__*} does not exist
echo Effectively checking this: [ -z ${abc_def+x} ] && echo abc_def does not exist
shopt -u extglob
편집 (@ikkachu의 답변에서):
shopt -s extglob
export var=abc_def__123__456
# does this variable (abc_def) exist?
if [[ ! -v ${var/%__*} ]]; then echo ${var/%__*} does not exist; fi
# does this variable (abc_def) exist? (with temp variable)
export temp=${var/%__*}
echo ${temp}
if [ ! -z ${temp+x} ]; then echo \'temp\' exists; fi # checks temp variable only
if [ -z ${!temp+x} ]; then echo ${temp} does not exist; fi
if [ -z ${abc_def+x} ]; then echo abc_def does not exist; fi
shopt -u extglob
추가 정보(출처:배쉬 매뉴얼):
하위 문자열 확장을 수행하지 않을 때 Bash는 아래에 설명된 형식(예: ":-")을 사용하여 설정되지 않은 인수 또는 null 인수를 테스트합니다. 콜론을 생략하면 설정되지 않은 매개변수만 테스트됩니다. 즉, 콜론이 포함된 경우 연산자는 두 가지를 모두 테스트합니다.매개변수존재하며 해당 값은 null이 아닙니다. 콜론이 생략되면 연산자는 존재 여부만 테스트합니다.
답변1
특히 Bash에서는 다음을 사용할 수 있습니다 [[ -v var ]]
.
$ foo=1; unset bar;
$ varname=foo
$ if [[ -v $varname ]]; then echo set; else echo not set; fi
set
$ varname=bar
$ if [[ -v $varname ]]; then echo set; else echo not set; fi
not set
[[ -v ${var/%__*} ]]
예 를 들어 작동합니다 .
또는 nameref와 함께 "대체 값" 확장을 사용할 수 있습니다(단, 해당 임시 변수가 필요함).
$ declare -n ref=foo
$ if [[ ${ref+set} = set ]]; then echo set; else echo not set; fi
set
$ declare -n ref=bar
$ if [[ ${ref+set} = set ]]; then echo set; else echo not set; fi
not set
또는 간접 확장과 동일 합니다 ${!var}
.${!var+set}