it-swarm-korea.com

bash 변수가 비어 있는지 확인하는 방법은 무엇입니까?

Bash의 변수가 비어 있는지 확인하는 가장 좋은 방법은 무엇입니까 ( "")?

if [ "x$variable" = "x" ]를 수행하는 것이 좋습니다.

올바른 방법입니까? (더 간단한 것이 있어야 함)

784
Brent

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

if [ -z "$VAR" ];
1075
duffbeer703

Bash에서 쉘을 지원하지 않는 쉘로의 이식성에 관심이없는 경우 항상 이중 대괄호 구문을 사용해야합니다.

다음 중 하나 :

if [[ -z $variable ]]
if [[ -z "$variable" ]]
if [[ ! $variable ]]
if [[ ! "$variable" ]]

Bash에서 큰 대괄호를 사용하면 따옴표가 필요하지 않습니다. does 변수에 대한 테스트를 단순화하여 다음을 수행 할 수 있습니다.

if [[ $variable ]]

이 구문은 ksh (적어도 ksh93 이상)와 호환됩니다. 순수 POSIX 또는 sh 또는 dash와 같은 이전 Bourne 쉘에서는 작동하지 않습니다.

이중 대괄호와 단일 대괄호의 차이점에 대한 자세한 내용은 여기서 내 대답BashFAQ/031 을 참조하십시오.

변수가 구체적으로 설정되어 있지 않은지 테스트 할 수 있습니다 (빈 문자열과 구별됨).

if [[ -z ${variable+x} ]]

여기서 "x"는 임의입니다.

변수가 null이지만 설정되지 않은지 알고 싶은 경우 :

if [[ -z $variable && ${variable+x} ]]

Bash (및 POSIX 호환 쉘)의 변수는 다음 세 가지 상태 중 하나 일 수 있습니다.

  • 설정 해제
  • 빈 문자열로 설정
  • 비어 있지 않은 문자열로 설정

대부분의 경우 변수가 비어 있지 않은 문자열로 설정되어 있는지 여부 만 알면되지만 설정되지 않은 문자열과 설정하지 않은 빈 문자열을 구분하는 것이 때때로 중요합니다.

다음은 다양한 가능성을 테스트하는 방법의 예이며 bash 또는 POSIX 호환 쉘에서 작동합니다.

if [ -z "${VAR}" ]; then
    echo "VAR is unset or set to the empty string"
fi
if [ -z "${VAR+set}" ]; then
    echo "VAR is unset"
fi
if [ -z "${VAR-unset}" ]; then
    echo "VAR is set to the empty string"
fi
if [ -n "${VAR}" ]; then
    echo "VAR is set to a non-empty string"
fi
if [ -n "${VAR+set}" ]; then
    echo "VAR is set, possibly to the empty string"
fi
if [ -n "${VAR-unset}" ]; then
    echo "VAR is either unset or set to a non-empty string"
fi

다음은 동일하지만 편리한 테이블 형식입니다.

                        +-------+-------+-----------+
                VAR is: | unset | empty | non-empty |
+-----------------------+-------+-------+-----------+
| [ -z "${VAR}" ]       | true  | true  | false     |
| [ -z "${VAR+set}" ]   | true  | false | false     |
| [ -z "${VAR-unset}" ] | false | true  | false     |
| [ -n "${VAR}" ]       | false | false | true      |
| [ -n "${VAR+set}" ]   | false | true  | true      |
| [ -n "${VAR-unset}" ] | true  | false | true      |
+-----------------------+-------+-------+-----------+

VAR이 설정되지 않은 경우 ${VAR+foo} 구문이 빈 문자열로 확장되고 foo이 빈 문자열을 포함하여 다른 것으로 설정된 경우 VAR로 확장됩니다.

${VAR-foo} 구문은 설정되면 (빈 문자열로 설정 포함) VAR의 값으로 확장되고 설정되지 않은 경우 foo으로 확장됩니다. 이는 사용자가 재정의 할 수있는 기본값을 제공하는 데 유용합니다 (예 : ${COLOR-red} 변수 red가 설정되지 않은 경우 COLOR 사용).

변수가 설정되지 않았는지 또는 빈 문자열로 설정되었는지 테스트하기 위해 [ x"${VAR}" = x ]가 권장되는 이유는 [ 명령의 일부 구현 (test이라고도 함) 때문입니다. 버기입니다. VAR-n와 같은 것으로 설정되면 [ "${VAR}" = "" ]에 대한 첫 번째 인수가 잘못 해석되어 일부 구현에서 [가 제공 될 때 잘못된 작업을 수행합니다. 문자열이 아닌 -n 연산자.

239
Richard Hansen

-z가 최선의 방법입니다.

내가 사용한 또 다른 옵션은 변수를 설정하는 것이지만 다른 변수로 대체 할 수 있습니다.

export PORT=${MY_PORT:-5432}

$MY_PORT 변수가 비어 있으면 PORT가 5432로 설정되고, 그렇지 않으면 PORT가 MY_PORT 값으로 설정됩니다. 구문에는 콜론과 대시가 포함됩니다.

38
Rory

Set-empty와 unset 상태의 경우를 구별하려면 bash의 -u 옵션을보십시오.

$ set -u
$ echo $BAR
bash: BAR: unbound variable
$ [ -z "$BAR" ] && echo true
bash: BAR: unbound variable
$ BAR=""
$ echo $BAR

$ [ -z "$BAR" ] && echo true
true
24
MikeyB

내가 본 다른 대안 [ -z "$foo" ]는 다음과 같지만 사람들이 왜이 방법을 사용하는지 잘 모르겠습니다.

[ "x${foo}" = "x" ]

어쨌든 설정되지 않은 변수를 허용하지 않으면 (set -u 또는 set -o nounset) 그렇다면 두 가지 방법 모두에 문제가 생길 수 있습니다. 이것에 대한 간단한 수정이 있습니다.

[ -z "${foo:-}" ]

참고 : 이렇게하면 변수가 undef로 남습니다.

8
errant.info

질문 변수가 빈 문자열인지 확인하는 방법을 묻습니다 최선의 답변이 이미 제공되어 있습니다.
그러나 나는 PHP에서 프로그래밍이 끝난 후에 여기에 도착했고 실제로 검색 한 것은 empty function in php bash Shell에서 작업하는 것과 같은 검사였습니다.
답을 읽은 후 나는 bash에서 올바르게 생각하지 않는다는 것을 깨달았지만 그 순간에 PHP의 empty와 같은 함수는 내 bash 코드에서 너무 유용했을 것입니다.
이것이 다른 사람들에게 발생할 수 있다고 생각하기 때문에 bash에서 php empty 함수를 변환하기로 결정했습니다.

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

  • ""(빈 문자열)
  • 0 (0 as an integer)
  • 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을 검사하면 부수적 인 문제가 발생할 수 있다고 말했지만이 함수를 사용하는 사람은이 위험을 평가하고 첫 번째 검사 만 남기고 검사를 중단하기로 결정했습니다. .

6
Luca Borrione

내 5 센트 : if ...보다 짧은 구문이 있습니다.

VALUE="${1?"Usage: $0 value"}"

인수가 제공된 경우이 행은 VALUE를 설정하고 오류 발생시 스크립트 행 번호 앞에 오류 메시지를 인쇄하고 스크립트 실행을 종료합니다.

다른 예는 abs-guide ("Example 10-7"검색)에서 찾을 수 있습니다.

5
gluk47

if-then 및 -z 전체가 필요하지 않습니다.

 [ "$ foo"] && echo "foo가 비어 있지 않습니다"
 [ "$ foo"] || echo "foo는 실제로 비어 있습니다"
5
namewithoutwords

$ FOO가 설정되어 있고 비어있는 경우에만 해당됩니다.

[ "${FOO+x}" = x ] && [ -z "$FOO" ]
4
JHS

duffbeer7 의 oneliner 확장 솔루션 :

#! /bin/bash
[ -z "$1" ] || some_command_that_needs_$1_parameter
4
andrej

개인적으로보다 명확한 확인 방법을 선호하십시오.

if [ "${VARIABLE}" == "" ]; then
  echo VARIABLE is empty
else
  echo VARIABLE is not empty
fi
4
Fedir RYKHTIK

정확한 답변은 아니지만이 트릭에 부딪 쳤습니다. 찾고있는 문자열이 "명령"에서 온 경우 실제로 env에 명령을 저장할 수 있습니다. 변수를 입력하고 if 문마다 매번 실행하면 대괄호가 필요하지 않습니다!

예를 들어이 명령은 데비안에 있는지 확인합니다.

grep debian /proc/version

전체 예 :

IS_DEBIAN="grep -i debian /proc/version"

if $IS_DEBIAN; then
  echo 'yes debian'
else
  echo 'non debian'
fi

따라서 이것은 빈 문자열을 확인하는 간접적 인 방법 (매번 실행)과 같습니다 (명령에서 오류 응답을 확인하지만 빈 문자열을 반환하는 경우도 있음).

0
rogerdpack