Bash에서 변수가 비어 있는지 확인하는 방법


262

Bash에서 변수가 비어 있는지 어떻게 확인할 수 있습니까?


2
어떤 종류 의 쉘 스크립트? *아니야?
TJ Crowder 2016 년

8
bash 쉘 스크립트
Tree



답변:


383

Bash에서 적어도 다음 명령 은 $ var이 비어 있는지 테스트 합니다 .

if [[ -z "$var" ]]; then
   # Do what you want
fi

명령 man test은 당신의 친구입니다.


62
이중 대괄호는 여기서 쓸모가 없습니다. 간단한 경우 [-z "$ var"] 또는 심지어 더 쉬운 imho 경우 -z "var".. 어쨌든 +1 :)
Luca Borrione

2
이중 사각형 괄호는 쓸모가 없지만 ./test.ksh[8]: test: argument expected이유를 알지 못하지만 단일 괄호는 작동하지 않지만 이중 괄호는 효과가 없었습니다.
gahlot.jaggs

8
@LucaBorrione 제 생각 if test -z "$var"에는 맞습니까?
neu242

1
질문에 직접 언급되지 않은 특정 상황에 대한 추가 된 주석 : 변수가 설정되지 않고 set -u옵션이 활성화 된 경우이 테스트는 실패합니다 unbound variable. 이 경우 @alexli의 솔루션을 선호 할 수 있습니다.
anol

3
@LucaBorrione 후기 메모와 마찬가지로 "[["는 "무용지물"이라고 볼 수 있습니다. "["를 사용하면 "["보다 몇 가지 장점이 있습니다 ( 예 : stackoverflow.com/questions/669452/… 참조 )
GhostCat

107

배쉬 추정 :

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
더 직접적인 대답은 -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
글렌 잭맨

4
@glenn jackman : 좋은 의견; -z요청 된 것에 더 가까운 것이 사실입니다 . Jay는 이것을 그의 대답에 넣었습니다. 그래서 나는 내 것을 업데이트하지 말고 그대로 둡니다.
ChristopheD

48

나는 또한 보았다

if [ "x$variable" = "x" ]; then ...

이것은 매우 강력하고 독립적입니다.

또한 "빈"과 "설정되지 않은"사이에는 차이가 있습니다. Bash 셸 스크립트에 문자열이 정의되어 있지 않은지 확인하는 방법을 참조하십시오 .


나에게 이상해 보인다. 이 솔루션을 설명해 주시겠습니까? 감사합니다.
guettli

2
@guettli : $variable비어있는 경우 비교 연산자의 왼쪽에있는 문자열은 only가되고 연산자 x의 오른쪽에있는 문자열과 같습니다. [ x = x ]"true"이므로 실제로 $variable는 비어 있는지 여부를 테스트합니다 . 덧붙여서 (실제로 3 년 반 :-)) 나는 -z아마도 내가 원하는 것을 더 명확한 방식으로 수행하기 때문에 나는 이것을 직접 사용하지 않을 것이지만,이 방법은 종종 "야생적으로"보이기 때문에이 대답을 추가하고 싶었다. 아마도 내가 가진 것과 다른 경험을 가진 사람들이 의도적으로 이런 방식으로 썼을 것입니다.
다니엘 앤더슨

30
if [ ${foo:+1} ]
then
    echo "yes"
fi

yes변수가 설정되어 있으면 인쇄 합니다. ${foo:+1}변수가 설정되면 1을 반환하고 그렇지 않으면 빈 문자열을 반환합니다.


2
질문에 언급되지 않았지만이 답변의 중요한 장점은 변수가 정의되지 않고 set -u옵션 ( nounset)이 활성화 된 경우에도 작동한다는 것 입니다. 이 경우이 질문에 대한 거의 모든 다른 대답은 실패 unbound variable합니다.
anol

:+표기법은 선택적 변수로 지정한 선택적 명령 행 매개 변수가있는 경우에도 유용합니다. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

var에 플러스 1 밖으로 기본값으로 좋은 방법
에히메

@ehime을 사용하여 기본값을 설정${variable:-default_value}
warvariuc

이것은 변수 항목의 유효성을 확인하고 설정되지 않은 경우 종료하는 빠른 방법입니다. [ "$variable" ] || exit
Marcel Sonderegger

8

true변수가 설정되지 않았거나 빈 문자열 ( "")로 설정 되면 반환 됩니다.

if [ -z "$MyVar" ]
then
   echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
   echo "The variable MyVar has something in it."
fi

3
elif !대신에 사용 else하시겠습니까?
ZiggyTheHamster 1

1
그냥 예를 사용하여 두 문장 사이의 구별을하는 ! [ -z "$MyVar" ]변수가됨을 의미 거기에 뭔가를. 그러나 이상적으로는 사용 else합니다.
3kstc

6

질문은 요청 변수가 빈 문자열인지 확인하는 방법 과 최고의 답변이 이미 주어진다.

그러나 PHP에서 프로그래밍이 끝난 후에 여기에 도착했으며 실제로 Bash 쉘에서 작동하는 PHP빈 함수 와 같은 검사를 찾고있었습니다 .

답변을 읽은 후 Bash에서 올바르게 생각하지 않는다는 것을 깨달았습니다. 그러나 그 순간 어쨌든 같은 기능 PHP에서 비어 가 Bash 코드에서 너무 유용 할 것입니다.

이것이 다른 사람들에게 발생할 수 있다고 생각하면서 Bash에서 PHP 빈 함수를 변환하기로 결정했습니다.

PHP 매뉴얼 에 따르면 :

변수가 존재하지 않거나 값이 다음 중 하나 인 경우 비어있는 것으로 간주됩니다.

  • ""(빈 문자열)
  • 0 (정수로 0)
  • 0.0 (플로트로 0)
  • "0"(문자열로 0)
  • 빈 배열
  • 선언되었지만 값이없는 변수

물론 nullfalse의 경우는 bash로 변환 할 수 없으므로 생략됩니다.

function empty
{
    local var="$1"

    # Return true if:
    # 1.    var is a null string ("" as empty string)
    # 2.    a non set variable is passed
    # 3.    a declared variable or array but without a value is passed
    # 4.    an empty array is passed
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is zero (0 as an integer or "0" as a string)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is 0.0 (0 as a float)
    elif [ "$var" == 0.0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return
    fi

    [[ $( echo "" ) ]]
}



사용 예 :

if empty "${var}"
    then
        echo "empty"
    else
        echo "not empty"
fi



데모 :
다음 스 니펫 :

#!/bin/bash

vars=(
    ""
    0
    0.0
    "0"
    1
    "string"
    " "
)

for (( i=0; i<${#vars[@]}; i++ ))
do
    var="${vars[$i]}"

    if empty "${var}"
        then
            what="empty"
        else
            what="not empty"
    fi
    echo "VAR \"$var\" is $what"
done

exit

출력 :

VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty

Bash 논리 에서이 기능에서 0에 대한 검사는 부작용을 일으킬 수 있다고 말했지만이 기능을 사용하는 사람은이 위험을 평가하고 첫 번째 검사 만 남기고 검사를 중단하기로 결정할 수 있습니다.


2

설정되지 않은 변수와 설정되어 있고 비어있는 변수를 구별 할 수 있습니다.

is_empty() {
    local var_name="$1"
    local var_value="${!var_name}"
    if [[ -v "$var_name" ]]; then
       if [[ -n "$var_value" ]]; then
         echo "set and non-empty"
       else
         echo "set and empty"
       fi
    else
       echo "unset"
    fi
}

str="foo"
empty=""
is_empty str
is_empty empty
is_empty none

결과:

set and non-empty
set and empty
unset

BTW, set -u설정되지 않은 변수를 읽을 때 오류가 발생하는 것을 권장 합니다.

rm -rf $dir

여기 에서 "엄격 모드"에 대한이 모범 사례 및 기타 모범 사례에 대해 읽을 수 있습니다 .


엄격한 모드 참조에 감사드립니다!
paulcm

1

변수 v가 ​​설정되어 있지 않은지 확인하려면

if [ "$v" == "" ]; then
   echo "v not set"
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.