이 질문에 이미 답변이 있습니다 :
답변
Answer
“true”와 “false”는 각각 성공과 실패를 반환하는 명령이기 때문에 자주 사용합니다. 그런 다음
if "$phone_missing"; then ...
답변
여기에 할 수있는 한 가지 방법이 있습니다. 참 / 거짓 값을 유지하면서.
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is true." fi
$phone_missing
는 변수 phone_missing
가 전혀 정의되지 않은 경우를 방지하기위한 것입니다.이를 방지하기위한 또 다른 일반적인 관용구는 [ x$phone_missing != xfalse ]
,하지만 따옴표가 더 자연스럽게 보입니다.
힌트는 iv id = “의 bash
도움말 페이지에 있습니다. 333a76237e “>
:
STRING True if string is not empty. ... ! EXPR True if expr is false.
따라서 기본적으로 [ $foo ]
는 $foo
가 비어 있지 않으면 true입니다. true 또는 false가 아니라 비어 있지 않습니다. [ ! $foo ]
는 $ foo가 비어 있거나 정의되지 않은 경우 true입니다.
언제든지 phone_missing
를 비로 설정하도록 코드를 변경할 수 있습니다. -빈 가치 e는 참을 나타냅니다. phone_missing
가 설정되지 않은 경우 (또는 비어있는 — phone_missing=""
) false가됩니다. 그렇지 않으면 문자열 테스트 연산자 (=
및 !=
)를 사용해야합니다.
다른 사소한 문제는 할당. $phone_missing=true
로되어 있지만 phone_missing=true
(달러 기호 없음)이어야합니다.
약간 빽빽한 것은 나 이기 때문입니다. 긴 하루였습니다. 🙂
다른 답변이 해결책을 제공했지만 원래 생각에 무엇이 잘못되었는지 설명하겠습니다.
배시 변수에는 유형이 없으므로 부울 변수 나 true 또는 false와 같은 값이 없습니다. 기본적으로 모든 bash 변수는 문자열 일뿐입니다.
테스트 유형을 지정하지 않고 bash에서 변수 / 문자열을 테스트 할 때 (-n
또는 -z
), 기본값은 -n
(길이가 0이 아닌 문자열) 테스트입니다.
그래서 [ "$var" ]
는 [ -n "$var" ]
와 같습니다. $var
에 1 개 이상의 문자가 포함되어 있으면 참으로 평가되었습니다.
표현식을 부정 했으므로 [ ! "$var" ]
는 [ ! -n "$var" ]
와 같습니다. 따라서 $var
에 문자가 1 개 이상 포함되어 있으면 표현식은 false입니다.
false
이후 (단순 문자열)에 5 개의 문자가 포함 된 경우 표현식은 거짓입니다. phone_missing
를 (true
, 0, 1)로 설정 한 문자열이 중요하지 않은 경우 표현식은 항상 false
는 phone_missing
길이가 0이 아니므로 길이입니다. true
를 만드는 유일한 방법은 길이가 0이므로
부울에 문자열을 사용하지 마십시오. 정수를 사용하세요.
입력 :
val=1 ((val)) && echo "true" || echo "false" val=0 ((val)) && echo "true" || echo "false"
출력 :
true false
소스 :
((표현식))
표현식은 산술 평가에서 아래 설명 된 규칙에 따라 평가됩니다. 표현식의 값이 0이 아니면 반환 상태는 0입니다. 그렇지 않으면 반환 상태는 1입니다. 이것은 let “expression”과 정확히 동일합니다.
James를 지원하기위한 의견으로이 작업을 수행했을 것입니다. Ko는 댓글을 달거나 공개적으로 찬성 할 담당자가 없었습니다.
여기서 문제는 [] 대괄호가 값 또는 문자열 같음과 같은 비교 테스트를 수행하기위한 표기법이라는 것입니다.
빈 문자열에 대한 bash의 문자열 진실성은 ""
(빈 문자열)가 false (반환 값 1)로 평가되고 비어 있지 않은 문자열 “false” “true “또는”bob “s your uncle”은 true로 평가됩니다 (반환 값 0).
다음을 통해이를 직접 증명할 수 있습니다.
if [ "foo" ]; then echo true is $?; else echo false is $?; fi
위의 $?
는 마지막 명령 종료 상태 (0 성공, 오류 코드의 경우> 0)를 보유하고 true is 0
. "foo"
를 원하는 것으로 바꿀 수 있으며 빈 문자열 ""
또는 ""
이 경우 else 조건을 평가하고 false is 1
를 출력합니다.
[ ] 괄호는! $ phone_missing과 같은 내부 문을 평가 한 다음 true 인 경우 0
를 반환하고 if contro에 대해 false 인 경우 1
를 반환합니다. 내가 진술. 대괄호가 문자열과 값 비교를 평가하기 때문에 $ phone_missing은 먼저 []에 의해 비어 있지 않은 문자열 (또는 true)로 평가되는 비어 있지 않은 문자열 “false”로 확장 된 다음! if 문이 false (또는 반환 값 1)를 얻는 결과를 반전하고, else 문이 있으면 실행하는 조건부 본문을 건너 뜁니다.
James Ko가 말했듯이 표기법은 if 제어문에 “부울”을 보유하는 변수. 참고 bash에서 부울 true 및 false는 다음과 같이 소문자 여야합니다. bool_true = true bool_false = false 다른 모든 경우 부울이 아닌 문자열로 평가합니다.
예와 James Ko의 대답을 사용하면 다음과 같습니다.
phone_missing=false echo "missing $phone_missing" if ! $phone_missing then echo "Lost phone at $readabletime" $phone_missing=true fi
또는 I 가독성을 선호합니다 (구문 적으로 동일하고 James Ko “s).
phone_missing=false echo "missing $phone_missing" if ( ! $phone_missing ); then echo "Lost phone at $readabletime" $phone_missing=true fi
Alexios와 같은 다른 답변은 문자 그대로 문자열 내용을 확인합니다. 따라서 다음 중 하나가 거짓이됩니다.
phone_missing=false if [ "$phone_missing" != false ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == true ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi if [ "$phone_missing" == Bobs_your_uncle ]; then echo "phone_missing is not "false" (but may be non-true, too)" fi
올바른 구문은 if ! $bool; then [statements]; fi
입니다.
예 :
bool=false if ! $bool; then echo "This is correct!" fi if [ ! $bool ]; then echo "This is wrong!" fi
출력 : This is correct!
댓글