2011-03-23 7 views
9

bash를 사용하면 변수가 비어 있는지 확인하는 가장 좋은 방법은 무엇입니까?bash의 비 설정 변수와 빈 변수의 차이점

내가 사용하는 경우이 설정되지 않은 변수에 대해 작동하는 포럼에서 제안하지만 변수가 설정하지만 비어있을 때 그것이 사실로

if [ -z "$VAR" ] 

. 제안 사항?

답변

1
if [ `set | grep '^VAR=$'` ] 

을이 문자열 검색 "VAR ="설정 변수의 목록.

+0

누가 당신을 투표했는지 모르겠지만 당신의 해결책은 저에게 효과적입니다! – green69

+0

나는 틀린 질문에 처음으로 대답했다. 다음은 수정 된 답변입니다. –

+1

내 downvote는 이것이 unidiomatic, 어색하고 비효율적이기 때문입니다. 셸에는이 기능이 내장되어 있습니다. 또한, 당신은 [쓸데없는 backticks의 사용] (http://www.iki.fi/era/unix/award.html#backticks)과 명백하게 [if 문이 무엇을하는지에 대한 불완전한 이해가 있습니다.] http://stackoverflow.com/questions/36371221/bash-if-statement-too-many-arguments/36371520#36371520) – tripleee

28

${var+set}은 변수가 설정되지 않은 경우는 아무 것도 대체하지 않으며 빈 문자열을 포함하여 아무것도 설정하지 않은 경우 set으로 대체합니다. ${var:+set}은 변수가 비어 있지 않은 문자열로 설정된 경우에만 set으로 바꿉니다. 당신은 어느 경우를 테스트하려면이 옵션을 사용할 수 있습니다

if [ "${foo+set}" = set ]; then 
    # set, but may be empty 
fi 

if [ "${foo:+set}" = set ]; then 
    # set and nonempty 
fi 

if [ "${foo-unset}" = unset ]; then 
    # foo not set or foo contains the actual string 'unset' 
    # to avoid a potential false condition in the latter case, 
    # use [ "${foo+set}" != set ] instead 
fi 

if [ "${foo:-unset}" = unset ]; then 
    # foo not set or foo empty or foo contains the actual string 'unset' 
fi 
+3

당신이 -' 반대 방식으로 작동합니다 '것을 추가 할 수 있습니다이 답변을 완성하기 위해, 즉'$ {foo-없이 unset}'foo가 설정되지 않은 경우 'unset'을 반환합니다. 이것은 마른 실행 스크립트에 유용합니다. 실제로 업로드를 수행하기 위해'DRYRUN = upblog.sh'로 실행되어야하는'rsync -avuz $ {DRYRUN --- dry-run} $ HOME/blog/webserver : blog /' –

+1

이것은 허용 된 대답이어야합니다. @ jcomeau_ictx의 뛰어난 코멘트가 포함 된 수정 된 답변. – dev

0

잘, 여기에 변수가 설정되지 않은 경우

$ s="" 
$ declare -p s 
declare -- s="" 
$ unset s 
$ declare -p s 
bash: declare: s: not found 

오류 메시지가 발생합니다 하나의 방법입니다.

+0

원래의 질문은 빈 문자열로 설정된 변수와 전혀 설정되지 않은 변수를 구별하는 방법이었습니다. 두 경우 모두 공백으로 반환됩니다. –

+0

예, 질문을 잘못 이해했습니다. 내 편집을 참조하십시오. – kurumi

0

당신은

[ -v name ]

이름으로 테스트 할 수는 $ 기호

+0

Bash v3.2.57 (1) 또는 v4.1.5 (1)에서 찾을 수 없습니다. 어떤 껍질이에요? – tripleee

+0

내 bash 쉘 버전은 우분투 15.10에서 4.3입니다. "-v"연산자가 있는지 여부를 "help test"명령으로 확인하십시오. 실제로 두 개의 테스트 명령이 있습니다 하나는 쉘 내장이고 다른 하나는/usr/bin/test입니다. – mug896

관련 문제