환경 변수를 설정 해제하는 것과 빈 문자열로 설정하는 것 사이에 실질적인 차이가 있습니까?
답변1
각 애플리케이션은 설정되지 않은 변수와 빈 변수를 동일하거나 다르게 해석할 수 있습니다. 서로 다른 의미를 부여하는 것은 일반적으로 나쁜 생각이며 대부분의 응용 프로그램에서는 이를 수행하지 않지만 실제로는 발생합니다.
쉘 자체의 예는 다음과 같습니다.IFS
쉘 변수(일반적으로 환경으로 내보내지지 않지만 동일한 원칙이 적용됩니다.) 설정하지 않으면 쉘은 이 값이 인 것처럼 동작합니다 $' \t\n'
.
쉘 스크립트에서는 null로 설정되었는지 여부에 관계없이 $foo
빈 문자열로 확장됩니다. foo
다음에서 쉘을 실행할 수 있습니다.nounset
설정( set -u
또는 set -o nounset
). 이 경우 설정되지 않은 변수를 확장하려고 하면 쉘이 오류를 보고하고 종료됩니다. 그렇지 않으면 다음을 사용하여 설정되지 않은 변수와 빈 변수를 구별할 수 있습니다.매개변수 확장수정자: 설정되지 않았거나 비어 있으면 빈 문자열로 확장되고 ${foo:+a}
, 그렇지 않으면 빈 문자열로 확장되고, 설정된 경우에도 빈 문자열로 확장됩니다.a
foo
${foo+a}
a
foo
답변2
예, 차이가 있습니다. 그러나 빈 문자열과 설정되지 않은 변수를 평가하는 것은 동일하기 때문에 이는 매우 미묘합니다.
$ env - FOO= sh -c 'echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XxX
FOO=
PWD=/tmp
$ env - FOO= sh -c 'unset FOO; echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XX
PWD=/tmp
둘 다 ${FOO:+x}
빈 문자열로 평가됩니다. 그러나 ${FOO+x}
FOO가 빈 문자열인 경우 "x"로 평가됩니다.
제가 많이 사용하는 것 중 하나는 $DEBUG
환경 변수를 설정한 다음 ${DEBUG+true}
프로그램에서 사용하는 것입니다. 그런 다음 빈 문자열을 포함하여 DEBUG를 무엇이든 설정할 수 있습니다.
Perl 및 Python과 같은 고급 언어에서 이는 ""와 undef(Perl) 또는 None(Python)의 차이입니다.
답변3
Bash 스크립트는 다음을 구별할 수 있습니다.
- (환경) 변수가 설정되지 않았습니다.
- 변수가 비어 있음으로 설정됨
- 빈 문자열로 설정된 변수
"기본 폴백"을 처리할 수 있는 가능성이 많기 때문에 일반적으로 이 세 가지 경우에는 차이가 없습니다. 인코더는 발견된 첫 번째 방법만 사용하는 경향이 있습니다. 수기본 대체 처리이와 같이:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
FOO=${VARIABLE:+default} # If variable is set use, use default.
# all replacing commands an be used also without ':', so it handles null cases differently
FOO=${VARIABLE-default} # If variable not set, use default.
# somewhat also used in wild using "test" (see man test"
[[ -z "$FOO" ]] && FOO="defoltíček : "
저는 변수에 빈 문자열을 사용할 가능성을 유지하는 것을 선호하므로 주로 다음 접근 방식을 사용합니다.
DEFAULT_INTERFACE=$(ip addr show | awk '/inet.*brd/{print $NF; exit}')
INTERFACE_TO_USE=${IFACE=$DEFAULT_INTERFACE}
참고: IFACE=
명령을 사용하면 환경 변수가 설정 해제됩니다. IFACE=""
변수를 빈 문자열로 설정하는 데 사용됩니다 .
비슷한 주제도 참조하세요https://stackoverflow.com/questions/2013547/designing-default-values-to-shell-variables-with-a-single-command-in-bash그리고명시적인 빈 문자열로 확장되도록 변수를 설정하시겠습니까?