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
'source' 카테고리의 다른 글
MySQL의 백틱과 따옴표는 어디에 사용합니까? (0) | 2023.04.17 |
---|---|
함수 파라미터에 아스타리스크가 표시됩니까? (0) | 2023.04.17 |
XAML 마크업만 사용하여 다른 컨트롤을 클릭했을 때 WPF 팝업을 열려면 어떻게 해야 합니까? (0) | 2023.04.17 |
N일보다 오래된 파일을 삭제하는 배치 파일 (0) | 2023.04.17 |
경과 시간을 계산하는 Bash 스크립트 (0) | 2023.04.17 |