Programming

배쉬 인 경우 [false];

procodes 2020. 7. 7. 21:17
반응형

배쉬 인 경우 [false]; true를 반환


이번 주 배쉬를 배우고 걸림돌에 부딪쳤다.

#!/bin/sh

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

조건이 다르게 표시 되더라도 항상 True를 출력합니다. 괄호 []제거하면 작동하지만 그 이유를 이해할 수 없습니다.


당신은 실행 [(일명 test명령을 실행하지, 인수 "거짓"으로) 명령을 false. "false"는 비어 있지 않은 문자열이므로 test항상 명령이 성공합니다. 실제로 명령을 실행하려면 명령을 삭제하십시오 [.

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

Bash에 대한 빠른 부울 입문서

if문은 인수로 명령을한다 (처럼 &&, ||등). 명령의 정수 결과 코드는 부울 (0 / null = true, 1 / else = false)로 해석됩니다.

test문은 인수로 연산자와 피연산자를 사용 하고 같은 형식의 결과 코드를 반환합니다 if. test명령문 의 별명은 보다 복잡한 비교를 수행 [하는 데 자주 사용됩니다 if.

truefalse문은 아무것도하지 않고 그 결과 코드를 반환 (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'vs 와 같은 일을하는 것과 비슷합니다 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"를 "거짓") 실패, 다음에 명령을 전달 if하거나 &&괄호없이 등 문. 복잡한 비교를 위해서는 적절한 연산자와 함께 대괄호를 사용하십시오.

그리고 그래, 내가 거기 배쉬의 기본 부울 형식 같은 건 없다, 그리고 알고 있어요 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

참고 URL : https://stackoverflow.com/questions/19670061/bash-if-false-returns-true

반응형