변수가 비어 있는지 또는 공백만 포함되어 있는지 테스트하는 방법은 무엇입니까?

변수가 비어 있는지 또는 공백만 포함되어 있는지 테스트하는 방법은 무엇입니까?

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

 [[ !  -z  $param  ]]

예를 들어:

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

출력이 안되는데 괜찮습니다.

그러나 param하나 이상의 공백 문자를 제외하고 비어 있으면 상황이 달라집니다.

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

"나는 0이 아니다"를 출력합니다.

공백 문자만 포함된 변수를 빈 것으로 처리하도록 테스트를 어떻게 변경할 수 있습니까?

답변1

먼저 주의사항-z시험명시적으로 사용되는 용도:

문자열 길이가 0입니다.

즉, 공백만 포함하는 문자열은아니요-z길이가 0이 아니기 때문에 다음은 참입니다 .

원하는 것은 다음을 사용하여 변수에서 공백을 제거하는 것입니다.패턴 교체 매개변수 확장:

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

이는 param변수를 확장하고 패턴의 모든 발생 (공백 1개)을 무엇이든 대체하므로 공백만 있는 문자열은 빈 문자열로 확장됩니다.


이것작동 방식의 본질${var/pattern/string}첫 번째로 가장 긴 일치 항목을 다음으로 바꾸는 것입니다 . (위와 같이) 시작하면 대체됩니다.patternstringpattern/모두대회. 대체 항목이 비어 있으므로 최종 값 /string값을 생략할 수 있습니다.

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

이것무늬파일 이름 확장과 마찬가지로 패턴을 생성하기 위해 확장됩니다.범위확장되고 가장 긴 일치무늬그에 대한 값은 다음으로 대체됩니다.. 만약에무늬'/'로 시작하는 모든 일치 항목무늬로 대체됩니다. 일반적으로 첫 번째 발생만 대체됩니다. ... 만약에비어 있음, 일치함무늬삭제된 및/또는 아래무늬생략 가능합니다.

결국 우리는 ${param// }모든 공백을 제거했습니다.

ksh(원본) 및 에 있지만 zshbash구문은 POSIX가 아니므로 sh스크립트에 사용해서는 안 됩니다.

답변2

문자열에 인증된 세트의 문자만 포함되어 있는지 확인하는 간단한 방법은 인증되지 않은 문자가 있는지 테스트하는 것입니다. 따라서 문자열에 공백만 포함되어 있는지 테스트하는 대신 문자열에 공백 이외의 문자가 포함되어 있는지 테스트합니다. 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에만 적용됩니다. 이러한 문자를 문자 그대로 스크립트에 삽입하거나(백슬래시 + 줄 바꿈이 null로 확장되므로 줄 바꿈은 따옴표 안에 있어야 합니다) 예를 들어 생성할 수 있습니다.

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

답변3

POSIX적으로:

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

구별하기 위해공백,공백이 아닌,비어 있는,설정되지 않음:

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

[:blank:]가로 간격 문자에 사용됩니다(ASCII의 공백 및 탭. 그러나 사용자의 로케일에는 더 많은 문자가 있을 수 있습니다. 일부 시스템에서는 가능한 경우 줄바꿈 방지 공백을 포함하지만 일부 시스템에서는 그렇지 않습니다). 세로 간격 문자(예: 줄 바꿈 또는 용지 공급)도 필요한 경우 [:blank:]로 바꾸세요 [:space:].

답변4

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

관련 정보