it-swarm-korea.com

변수가 비어 있거나 공백 만 포함되어 있는지 테스트하려면 어떻게해야합니까?

다음 bash 구문은 param가 비어 있지 않은지 확인합니다.

 [[ !  -z  $param  ]]

예를 들면 다음과 같습니다.

param=""
[[ !  -z  $param  ]] && echo "I am not zero"

출력이없고 괜찮습니다.

그러나 하나 이상의 공백 문자를 제외하고 param가 비어 있으면 대소 문자가 다릅니다.

param=" " # one space
[[ !  -z  $param  ]] && echo "I am not zero"

"0이 아님"이 출력됩니다.

공백 문자 만 포함 된 변수를 비어있는 것으로 간주하도록 테스트를 변경하려면 어떻게해야합니까?

261
maihabunash

먼저 -z test 은 다음에 대한 것입니다.

문자열의 길이는 0입니다

즉, 공백 만 포함하는 문자열은 길이가 0이 아니므로 -z에서 not 이 아니어야합니다.

원하는 것은 pattern replacement parameter expansion 을 사용하여 변수에서 공백을 제거하는 것입니다.

[[ -z "${param// }" ]]

이렇게하면 param 변수가 확장되고 패턴 (단일 공백)의 모든 일치 항목이 아무것도없는 것으로 대체되므로 공백 만있는 문자열은 빈 문자열로 확장됩니다.


어떻게 작동하는지에 대한 요점${var/pattern/string}pattern의 첫 번째 가장 긴 일치 항목을 string로 바꾼다는 것입니다. pattern/로 시작하면 (위와 같이) all 일치 항목을 대체합니다. 교체가 비어 있으므로 최종 /string 값을 생략 할 수 있습니다.

$ {매개 변수/패턴/문자열}

pattern은 파일 이름 확장과 마찬가지로 패턴을 생성하도록 확장됩니다. Parameter 확장되고 해당 값에 대한 pattern의 가장 긴 일치 항목이 string으로 바뀝니다. pattern이‘/’로 시작하면 pattern의 모든 일치 항목이 string으로 바뀝니다. 일반적으로 첫 번째 일치 항목 만 교체됩니다. ... string이 null 인 경우 pattern의 일치 항목이 삭제되고/follow pattern은 생략 될 수 있습니다.

모든 공간을 삭제하려면 ${param// }로 끝납니다.

ksh (원산지), zshbash에 있지만 해당 구문은 POSIX가 아니므로 sh 스크립트에서 사용하면 안됩니다.

304
Michael Homer

문자열에 인증 된 세트의 문자 만 포함되어 있는지 확인하는 쉬운 방법은 인증되지 않은 문자가 있는지 테스트하는 것입니다. 따라서 문자열에 공백 만 포함되어 있는지 테스트하는 대신 문자열에 공백 이외의 문자가 포함되어 있는지 테스트하십시오. bash, ksh 또는 zsh에서 :

if [[ $param = *[!\ ]* ]]; then
  echo "\$param contains characters other than space"
else
  echo "\$param consists of spaces only"
fi

“공백으로 만 구성”에는 빈 (또는 설정되지 않은) 변수의 경우가 포함됩니다.

공백 문자를 테스트 할 수 있습니다. 로케일 설정 또는 테스트하려는 공백 문자 목록을 사용하려면 [[ $param = *[^[:space:]]* ]]를 사용하십시오. [[ $param = *[$' \t\n']* ]]는 공백, 탭 또는 줄 바꾸기를 테스트합니다.

= 안에 [[ … ]]가있는 패턴과 문자열을 일치시키는 것은 ksh 확장자입니다 (bash 및 zsh에도 있음). Bourne/POSIX 스타일에서는 case 구문을 사용하여 문자열을 패턴과 일치시킬 수 있습니다. 표준 쉘 패턴은 대부분의 정규 표현식 구문에서와 같이 ! 대신 ^를 사용하여 문자 세트를 무효화합니다.

case "$param" in
  *[!\ ]*) echo "\$param contains characters other than space";;
  *) echo "\$param consists of spaces only";;
esac

공백 문자를 테스트하기 위해 $'…' 구문은 ksh/bash/zsh에만 적용됩니다. 스크립트에 문자를 문자 그대로 삽입하거나 (백 슬래시 + 줄 바꿈이 아무것도 확장되지 않기 때문에 줄 바꿈은 따옴표 안에 있어야 함) 또는 예를 들어 생성 할 수 있습니다.

whitespace=$(printf '\n\t ')
case "$param" in
  *[!$whitespace]*) echo "\$param contains non-whitespace characters";;
  *) echo "\$param consists of whitespace only";;
esac

POSIXly :

case $var in
  (*[![:blank:]]*) echo '$var contains non blank';;
  (*) echo '$var contains only blanks or is empty or unset'
esac

blank, non-blank, empty, nset을 구별하려면 :

case ${var+x$var} in
  (x) echo empty;;
  ("") echo unset;;
  (x*[![:blank:]]*) echo non-blank;;
  (*) echo blank
esac

[:blank:]는 가로 간격 문자 (ASCII의 공백 및 탭) 용이지만 로캘에 약간 더있을 수 있습니다. 일부 시스템에는 비 분리 공간 (사용 가능한 경우)이 포함되며 일부는 그렇지 않습니다. 줄 바꿈이나 폼 피드와 같이 세로 간격 문자를 원하면 [:blank:][:space:].

22
Stéphane Chazelas

-good 스크립팅 언어로 된 스크립트 대신 쉘 스크립트를 작성하는 유일한 이유는 극단적 인 이식성이 가장 중요한 문제입니다. 레거시 /bin/sh만이 확실하지만 Perl은 more Bash보다 크로스 플랫폼에서 사용 가능할 것입니다. 따라서 실제로 보편적 인이 아닌 기능을 사용하는 쉘 스크립트를 작성하지 말고 몇몇 독점 유닉스 벤더가 자신의 쉘 환경을 동결했음을 명심하십시오 POSIX.1-2001 이전 =.

이 테스트를 수행하는 휴대용 방법이 있지만 tr를 사용해야합니다.

[ "x`printf '%s' "$var" | tr -d "$IFS"`" = x ]

편리하게도 $IFS의 기본값은 공백, 탭 및 줄 바꿈입니다.

(printf 빌트인 자체는 이식성이 뛰어나지 만 의존하는 것은 echo의 변형을 알아내는 것보다 훨씬 덜 번거 롭습니다.)

5
zwol
if [[ -n "${variable_name/[ ]*\n/}" ]]
then
    #execute if the the variable is not empty and contains non space characters
else
    #execute if the variable is empty or contains only spaces
fi
5
Guru

게시 한 코드 [[ ! -z $param ]] && echo "I am not zero"I am not zero param이 설정되지 않았거나 정의되지 않았거나 비어있는 경우 (bash, ksh 및 zsh에서).

Param에 공백 만 있으면 (공백 제거) POSIXly(더 넓은 범위의 쉘)) --- (also 인쇄

 [   -z "${param#"${param%%[! ]*}"}"   ] && echo "empty"

설명:

  • ${param# … }leading 텍스트를 제거합니다.
  • 그 선행 텍스트는 다음과 같습니다. ${param%%[! ]*}
  • 앞의 모든 공백 임의의 공백이 아닌 문자, 즉 모든 선행 공백으로 확장됩니다.

전체 확장의 결과로 모든 선행 공간이 제거됩니다.

이 확장 결과는 길이가 0 인 경우 테스트됩니다.

  • 결과가 비어 있으면 변수가 비어 있거나
  • 선행 공백을 제거하면 공백이 생겼습니다.

따라서 테스트가 참이면 변수가 이미 비어 있거나 내부에 공백 만있는 것입니다.


이 개념은 더 많은 문자 유형으로 확장하기 쉽습니다. 탭도 포함 시키려면 대괄호 표현식 안에 명시 적 탭을 배치하십시오.

 [ -z "${param#"${param%%[!     ]*}"}" ] && echo "empty"

또는 제거해야 할 문자가있는 변수를 사용하십시오.

 var=$' \t'                                    # in ksh, bash, zsh
 [ -z "${param#"${param%%[!$var]*}"}" ] && echo "empty"

또는 POSIX "문자 클래스 표현식"을 사용할 수 있습니다 (공백은 공백과 탭을 의미 함).

 [ -z "${param#"${param%%[![:blank:]]*}"}" ] && echo "empty"
1
Isaac

변수가 비어 있거나 공백을 포함하는지 테스트하려면 다음 코드를 사용할 수도 있습니다.

${name:?variable is empty}
1
pratik