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)
  • 빈 배열
  • 선언되었지만 값이없는 변수

물론 null 과 false의 경우는 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.