programing

Bash에서 길이가 0이 아닌 문자열 테스트: [ -n "$var" ]또는 [$var"]

elseif 2023. 4. 9. 21:08

Bash에서 길이가 0이 아닌 문자열 테스트: [ -n "$var" ]또는 [$var"]

Bash 스크립트가 길이가 0이 아닌 문자열을 테스트하는 방법은 두 가지가 있습니다.는 ""를 합니다.-n★★★★

#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
  # Do something when var is non-zero length
fi

그러나 -n 옵션은 실제로 필요하지 않습니다.

# Without the -n option
if [ "$var" ]; then
  # Do something when var is non-zero length
fi

어떤 방법이 더 나을까요?

마찬가지로 제로렝스 테스트에는 다음과 같은 방법이 적합합니다.

if [ -z "$var" ]; then
  # Do something when var is zero-length
fi

또는

if [ ! "$var" ]; then
  # Do something when var is zero-length
fi

편집: 이 버전은 보다 완전한 버전으로, (일명,test) 및 를 참조해 주세요.

되었는지 여부, 또는 괄호를 하는지 여부, 되어 있는지 을 미치는 .-n/-z변수를 확인하는 데 적합합니다.

     | 1a    2a    3a    4a    5a    6a   | 1b    2b    3b    4b    5b    6b
     | [     ["    [-n   [-n"  [-z   [-z" | [[    [["   [[-n  [[-n" [[-z  [[-z"
-----+------------------------------------+------------------------------------
unset| false false true  false true  true | false false false false true  true
null | false false true  false true  true | false false false false true  true
space| false true  true  true  true  false| true  true  true  true  false false
zero | true  true  true  true  false false| true  true  true  true  false false
digit| true  true  true  true  false false| true  true  true  true  false false
char | true  true  true  true  false false| true  true  true  true  false false
hyphn| true  true  true  true  false false| true  true  true  true  false false
two  | -err- true  -err- true  -err- false| true  true  true  true  false false
part | -err- true  -err- true  -err- false| true  true  true  true  false false
Tstr | true  true  -err- true  -err- false| true  true  true  true  false false
Fsym | false true  -err- true  -err- false| true  true  true  true  false false
T=   | true  true  -err- true  -err- false| true  true  true  true  false false
F=   | false true  -err- true  -err- false| true  true  true  true  false false
T!=  | true  true  -err- true  -err- false| true  true  true  true  false false
F!=  | false true  -err- true  -err- false| true  true  true  true  false false
Teq  | true  true  -err- true  -err- false| true  true  true  true  false false
Feq  | false true  -err- true  -err- false| true  true  true  true  false false
Tne  | true  true  -err- true  -err- false| true  true  true  true  false false
Fne  | false true  -err- true  -err- false| true  true  true  true  false false

변수의 길이가 0이 아닌지를 확인하려면 다음 중 하나를 수행합니다.

  • 변수를 단일 괄호로 묶습니다(열 2a).
  • -n 4a 안에 로 묶어서 (열 4a)
  • 를 붙이거나 붙이거나 -n 1b - 게시판: 1b - 4b)

"하는 1a 열의 는 "2"가 "1a"임을 .[는 조건식의 일부인 것처럼 변수의 내용을 평가하고 있습니다(결과는 설명란의 "T" 또는 "F"에 의해 암시된 어설션과 일치합니다).언제[[1b라고 합니다. 변수 내용은 문자열로 표시되며 평가되지 않습니다.

3a 및 5a 열의 오류는 변수 값에 공백이 포함되어 있고 변수가 따옴표로 묶이지 않았기 때문에 발생합니다.에 나와 처럼 3b와 5b에 나와 [[는 변수의 내용을 문자열로 평가합니다.

이에 대응하여 길이 0 문자열 테스트의 경우 열 6a, 5b 및 6b에 올바른 방법이 나와 있습니다.또한 부정하는 것이 반대 연산을 사용하는 것보다 더 명확한 의도를 보일 경우 이러한 테스트 중 하나를 부정할 수 있습니다.를 들면, '먹다'와 같이요.if ! [[ -n $var ]].

★★★★★★★★★를 사용하고 있는 경우는[예기치 않은 결과를 초래하지 않도록 하려면 변수를 인용하는 것이 중요합니다.「」를 사용합니다.[[하지 않다츠요시

억제되고 있는 에러 메세지는, 「단항 연산자 예상」또는 「바이너리 연산자 예상」입니다.

위의 표를 작성한 스크립트입니다.

#!/bin/bash
# by Dennis Williamson
# 2010-10-06, revised 2010-11-10
# for http://stackoverflow.com/q/3869072
# designed to fit an 80 character terminal

dw=5    # description column width
w=6     # table column width

t () { printf '%-*s' "$w" " true"; }
f () { [[ $? == 1 ]] && printf '%-*s' "$w" " false" || printf '%-*s' "$w" " -err-"; }

o=/dev/null

echo '     | 1a    2a    3a    4a    5a    6a   | 1b    2b    3b    4b    5b    6b'
echo '     | [     ["    [-n   [-n"  [-z   [-z" | [[    [["   [[-n  [[-n" [[-z  [[-z"'
echo '-----+------------------------------------+------------------------------------'

while read -r d t
do
    printf '%-*s|' "$dw" "$d"

    case $d in
        unset) unset t  ;;
        space) t=' '    ;;
    esac

    [ $t ]        2>$o  && t || f
    [ "$t" ]            && t || f
    [ -n $t ]     2>$o  && t || f
    [ -n "$t" ]         && t || f
    [ -z $t ]     2>$o  && t || f
    [ -z "$t" ]         && t || f
    echo -n "|"
    [[ $t ]]            && t || f
    [[ "$t" ]]          && t || f
    [[ -n $t ]]         && t || f
    [[ -n "$t" ]]       && t || f
    [[ -z $t ]]         && t || f
    [[ -z "$t" ]]       && t || f
    echo

done <<'EOF'
unset
null
space
zero    0
digit   1
char    c
hyphn   -z
two     a b
part    a -a
Tstr    -n a
Fsym    -h .
T=      1 = 1
F=      1 = 2
T!=     1 != 2
F!=     1 != 1
Teq     1 -eq 1
Feq     1 -eq 2
Tne     1 -ne 2
Fne     1 -ne 1
EOF

보다 강력한 것을 사용하는 것이 좋다. [[배쉬에 관한 한요

통상의 경우

if [[ $var ]]; then   # var is set and it is not empty
if [[ ! $var ]]; then # var is not set or it is set to an empty string

위의 두 가지 구성은 깨끗하고 읽기 쉬워 보입니다.그들은 대부분의 경우에 충분할 것이다.

, 이 안에 있는 가 없습니다.[[단어 분할과 지구본위험이 없기 때문이다.

Shell Check의 소프트한 불만 사항을 방지하기 위해[[ $var ]] ★★★★★★★★★★★★★★★★★」[[ ! $var ]] , 을 할 수 있습니다.-n★★★★★★ 。

드문 경우

드물게 "빈 문자열로 설정"과 "전혀 설정되지 않음"을 구분해야 하는 경우 다음을 사용할 수 있습니다.

if [[ ${var+x} ]]; then           # var is set but it could be empty
if [[ ! ${var+x} ]]; then         # var is not set
if [[ ${var+x} && ! $var ]]; then # var is set and is empty

,도 쓸 수 요.-v 예:

if [[ -v var ]]; then             # var is set but it could be empty
if [[ ! -v var ]]; then           # var is not set
if [[ -v var && ! $var ]]; then   # var is set and is empty
if [[ -v var && -z $var ]]; then  # var is set and is empty

관련 투고 및 문서

이 주제와 관련된 많은 게시물이 있습니다.다음은 몇 가지 예입니다.

여기 몇 가지 테스트가 더 있습니다.

문자열이 비어 있지 않으면 True:

[ -n "$var" ]
[[ -n $var ]]
test -n "$var"
[ "$var" ]
[[ $var ]]
(( ${#var} ))
let ${#var}
test "$var"

문자열이 비어 있으면 True:

[ -z "$var" ]
[[ -z $var ]]
test -z "$var"
! [ "$var" ]
! [[ $var ]]
! (( ${#var} ))
! let ${#var}
! test "$var"

유감스럽게도 애초에 이 구문이 두 개 있는 이유를 알 수 없었습니다.둘 다 1979년 버전7 Unix에서 동시에 도입된 것으로 보입니다.

1994 싱글 유닉스 사양은-n ★★★★★★★★★★★★★★★★★」-z구문을 사용합니다.이후 최신 버전 POSIX.1-2017을 포함한 모든 버전의 POSIX에 동일한 권장 사항이 그대로 복사되었습니다.

다음 두 가지 명령어가 있습니다.

test "$1"
test ! "$1"

일부 과거 시스템에서는 안정적으로 사용할 수 없습니다.이러한 문자열 식이 사용되고 $1이 '!', '(), 또는 알려진 단항 프라이머리로 확장되면 예기치 않은 결과가 발생합니다.더 나은 구조는 다음과 같습니다.

test -n "$1"
test -z "$1"

각각 다음과 같다.

하세요.-n ★★★★★★★★★★★★★★★★★」-z28년 이상 된 시스템과의 호환성이 필요한가요?

제제 in in in in in in in in의 이라고 생각합니다.if [ "$var" ] ★★★★★★★★★★★★★★★★★」if [ ! "$var" ]그 구문이 확실한 승자가 됩니다.하지만 중요한 것은 기능적으로 차이가 없기 때문에 개인 취향대로 하세요.

정답은 다음과 같습니다.

if [[ -n $var ]] ; then
  blah
fi

「 」의 .[[...]]변수 견적을 올바르게 처리합니다.

빈 환경변수를 보다 투명하게 평가하는 대체 방법은 다음을 사용하는 것입니다.

  if [ "x$ENV_VARIABLE" != "x" ] ; then
      echo 'ENV_VARIABLE contains something'
  fi

case/esac다음 중 하나:

case "$var" in
  "") echo "zero length";;
esac

언급URL : https://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var