source

bash "if [ false ];"는 false 대신 true를 반환합니다.이유는?

ittop 2023. 4. 17. 22:26
반응형

bash "if [ false ];"는 false 대신 true를 반환합니다.이유는?

다음 출력은 왜True?

#!/bin/sh

if [ false ]; then
    echo "True"
else
    echo "False"
fi

이것은 항상 출력됩니다.True상황이 다르게 보일지라도 말이죠브래킷을 분리하면[]효과가 있는데 왜 그런지 이해가 안 돼요.

를 실행하고 있습니다.[(일명test인수 "false"를 사용하여 명령어를 실행하지 않음) 명령어false. "false"는 공백이 아닌 문자열이므로test명령어는 항상 성공합니다.명령어를 실제로 실행하려면[명령어를 입력합니다.

if false; then
   echo "True"
else
   echo "False"
fi

Bash용 퀵부울 프라이머

명령어를 인수로 사용합니다(do와 마찬가지로).&&,||등).명령어의 정수 결과 코드는 부울(0/sublic=true, 1/sublic=false)로 해석됩니다.

이 문은 연산자와 오퍼랜드를 인수로 사용하여 다음과 같은 형식의 결과 코드를 반환합니다.if의 에일리어스test스테이트먼트는[이것은, 자주 와 함께 사용됩니다.if더 복잡한 비교를 수행할 수 있습니다.

문은 아무것도 하지 않고 결과 코드(각각 0 및 1)를 반환합니다.따라서 Bash에서 부울 리터럴로 사용할 수 있습니다.하지만 문장이 문자열로 해석되는 곳에 두면 문제가 생깁니다.고객님의 경우:

if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ...     # "if the command foo succeeds, return true"

그래서:

if [ true  ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true      ; then echo "This text will always appear." ; fi;
if false     ; then echo "This text will never appear."  ; fi;

이거는 뭐 이런 거시기랑 비슷해요.echo '$foo'대.echo "$foo".

를 사용하는 경우test문, 결과는 사용된 연산자에 따라 달라집니다.

if [ "$foo" = "$bar" ]   # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ]         # true if $foo is a file that exists (by path)
if [ "$foo" ]            # true if $foo evaluates to a non-empty string
if foo                   # true if foo, as a command/subroutine,
                         # evaluates to true/success (returns 0 or null)

, 합격/불합격(일명 'true'/'false')으로 테스트하는 경우 명령어를 다음 명령어로 전달합니다.if또는&&괄호 없는 등.복잡한 비교를 위해서는 적절한 측정 시스템이 있는 대괄호를 사용하십시오.

네, Bash에는 네이티브 부울 타입이라는 것이 없다는 것을 알고 있습니다.if그리고.[그리고.true에는 기술적으로 '설명'이 아닌 '설명'이 있습니다.이것은 매우 기본적인 기능적인 설명일 뿐입니다.

다음과 같은 기본적인 논리를 실행할 수 있습니다.

A=true
B=true
if ($A && $B); then
    C=true
else
    C=false
fi
echo $C

true/false를 사용하면 일부 괄호 잡음이 제거됩니다.

#! /bin/bash    
#  true_or_false.bash

[ "$(basename $0)" == "bash" ] && sourced=true || sourced=false

$sourced && echo "SOURCED"
$sourced || echo "CALLED"

# Just an alternate way:
! $sourced  &&  echo "CALLED " ||  echo "SOURCED"

$sourced && return || exit

@signee가 지적한 바와 같이, 이것은 기껏해야 접선입니다.

그래도 만약 당신이 (나처럼) 그런 것을 찾아 이곳에 온다면, 여기 내 해결책이 있다.

사용자가 접근할 수 있는 설정 파일을 처리해야 하는 경우 다음 기능을 사용합니다.

function isTrue() {
    if [[ "${@^^}" =~ ^(TRUE|OUI|Y|O$|ON$|[1-9]) ]]; then return 0;fi
    return 1
    }

wich는 그렇게 사용될 수 있다.

if isTrue "$whatever"; then..

regexp에서 "진실 목록"을 변경할 수 있습니다. 이 예의 "진실 목록"은 프랑스어 호환성이 있으며 "Yeah, yep, on, 1, Oui, y, true"와 같은 문자열을 "True"로 간주합니다.

'^^'은 대소문자를 구분하지 않습니다.

콘텍스트를 추가하여 이 주제에 대해 좀 더 명확하게 할 수 있기를 바랍니다.BaaS의 초보자에게는 진실/거짓말의 감각은 다소 이상합니다.다음의 간단한 예와 그 결과를 예로 들 수 있습니다.

이 문장은 "true"를 반환합니다.

foo=" "; if [ "$foo" ]; then echo "true"; else echo "false"; fi

그러나 "false"가 반환됩니다.

foo=" "; if [ $foo ]; then echo "true"; else echo "false"; fi

왜 그런지 알겠어요?첫 번째 예에는 따옴표로 둘러싸인 " 문자열이 있습니다.이로 인해 BaaS는 이를 문자 그대로 처리합니다.즉, 문자 그대로 공백은 null이 아닙니다.비문자적 의미(위의 두 번째 예)에서는 공백은 BaaS($foo의 값으로)에 의해 "nothing"으로 간주되므로 null(여기서는 "false"로 해석됨)로 간주됩니다.

다음 문장은 모두 "false" 텍스트 문자열을 반환합니다.

foo=; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=; if [ "$foo" ]; then echo "true"; else echo "false"; fi
foo=""; if [ $foo ]; then echo "true"; else echo "false"; fi
foo=""; if [ "$foo" ]; then echo "true"; else echo "false"; fi

흥미롭게도 이 유형의 조건부 값은 항상 true로 반환됩니다.

다음 문장은 모두 "참" 결과를 반환합니다.

foo=""; if [ foo ]; then echo "true"; else echo "false"; fi

차이점에 주의해 주십시오.조건부 변수 이름 앞에는 $ 기호가 생략되어 있습니다.괄호 사이에 어떤 단어를 넣어도 상관없습니다.BaaS는 지금까지 같은 셸에서 변수와 관련지어 본 적이 없는 단어를 사용하더라도 이 문을 항상 참으로 간주합니다.

if [ sooperduper ]; then echo "true"; else echo "false"; fi

마찬가지로 선언되지 않은 변수로 정의하면 항상 false가 반환됩니다.

if [ $sooperduper ]; then echo "true"; else echo "false"; fi

BaaS에 대해서는 다음과 같습니다.

sooperduper="";if [ $sooperduper ]; then echo "true"; else echo "false"; fi

한 가지 팁 더...

브래킷 vs 비브래킷

더 혼란스러운 것은 IF/THEN 조건에서의 이러한 변화는 모두 작동하지만 결과는 반대입니다.

false가 반환됩니다.

if [ $foo ]; then echo "true"; else echo "false"; fi
if [ ! foo ]; then echo "true"; else echo "false"; fi

단, true의 결과가 반환됩니다.

if $foo; then echo "true"; else echo "false"; fi
if [ foo ]; then echo "true"; else echo "false"; fi
if [ ! $foo ]; then echo "true"; else echo "false"; fi

물론 구문 오류가 반환됩니다('false'의 결과).

if foo; then echo "true"; else echo "false"; fi

아직도 혼란스럽죠?특히 다른 고급 프로그래밍 언어에 익숙하다면 처음에 그것을 머릿속에 그대로 유지하는 것은 상당히 어려울 수 있습니다.

언급URL : https://stackoverflow.com/questions/19670061/bash-if-false-returns-true-instead-of-false-why

반응형