etc./StackOverFlow

쉘 스크립트에서 부울 변수를 어떻게 선언하고 사용할 수 있습니까?

청렴결백한 만능 재주꾼 2023. 5. 4. 22:15
반응형

질문자 :hassaanm


다음 구문을 사용하여 쉘 스크립트에서 부울 변수를 선언하려고 했습니다.

 variable=$false variable=$true

이 올바른지? 또한 해당 변수를 업데이트하려면 동일한 구문을 사용해야 합니까? 마지막으로 부울 변수를 표현식으로 사용하기 위한 다음 구문이 올바른가요?

 if [ $variable ] if [ !$variable ]


수정된 답변(2014년 2월 12일)

 the_world_is_flat=true # ...do something interesting... if [ "$the_world_is_flat" = true ] ; then echo 'Be careful not to fall off!' fi

원래 답변

주의 사항: https://stackoverflow.com/a/21210966/89391

 the_world_is_flat=true # ...do something interesting... if $the_world_is_flat ; then echo 'Be careful not to fall off!' fi

From: Bash에서 부울 변수 사용

여기에 원답을 포함시킨 이유는 2014년 2월 12일 개정 전 댓글이 원답에만 해당되고, 수정된 답과 관련하여 틀린 댓글이 많기 때문입니다. true 에 대한 Dennis Williamson의 의견은 수정되지 않은 원래 답변에만 적용됩니다.


miku

TL;DR

 my_bool=true if [ "$my_bool" = true ]

Miku의 ( original ) 답변 문제

나는 허용된 답변을 권장 하지 않습니다 1 . 구문은 예쁘지만 몇 가지 결함이 있습니다.

다음과 같은 조건이 있다고 가정합니다.

 if $var; then echo 'Muahahaha!' fi

다음 경우 2 에서 이 조건은 true로 평가되고 중첩된 명령을 실행합니다.

 # Variable var not defined beforehand. Case 1 var='' # Equivalent to var="". # Case 2 var= # Case 3 unset var # Case 4 var='<some valid command>' # Case 5

var )가 명시적으로 true로 설정된 경우에만 조건이 true로 평가되기를 원합니다. 다른 모든 경우는 위험할 정도로 오해의 소지가 있습니다!

마지막 경우(#5)는 변수에 포함된 명령을 실행하기 때문에 특히 좋지 않습니다(이 때문에 조건이 유효한 명령 3, 4에 대해 true로 평가됨).

다음은 무해한 예입니다.

 var='echo this text will be displayed when the condition is evaluated' if $var; then echo 'Muahahaha!' fi # Outputs: # this text will be displayed when the condition is evaluated # Muahahaha!

변수를 인용하는 것이 더 안전합니다. 예를 들어 if "$var"; then . 위의 경우 명령을 찾을 수 없다는 경고가 표시되어야 합니다. 그러나 우리는 여전히 더 잘할 수 있습니다(하단에 있는 내 권장 사항 참조).

Miku의 원래 답변에 대한 Mike Holt의 설명도 참조하십시오.

Hbar의 답변 문제

이 접근 방식에는 예기치 않은 동작도 있습니다.

 var=false if [ $var ]; then echo "This won't print, var is false!" fi # Outputs: # This won't print, var is false!

위의 조건이 false로 평가되므로 중첩된 문을 실행하지 않을 것으로 예상할 수 있습니다. 놀라다!

값 (인용 "false" 변수 (인용) "$var" ) 또는 사용 test 또는 [[ 대신 [ , 차이를하지 않습니다.

내가 추천하는 일 :

다음은 "부울"을 확인하는 것이 좋습니다. 그들은 예상대로 작동합니다.

 my_bool=true if [ "$my_bool" = true ]; then if [ "$my_bool" = "true" ]; then if [[ "$my_bool" = true ]]; then if [[ "$my_bool" = "true" ]]; then if [[ "$my_bool" == true ]]; then if [[ "$my_bool" == "true" ]]; then if test "$my_bool" = true; then if test "$my_bool" = "true"; then

그것들은 모두 거의 동등합니다. 다른 답변 5 의 접근 방식보다 키 입력을 몇 번 더 입력해야 하지만 코드는 더 방어적입니다.


각주

  1. Miku의 답변은 이후 편집되었으며 더 이상 (알려진) 결함이 없습니다.
  2. 전체 목록이 아닙니다.
  3. 이 컨텍스트에서 유효한 명령은 존재하는 명령을 의미합니다. 명령이 올바르게 사용되었는지 또는 잘못 사용되었는지는 중요하지 않습니다. 예를 들어 man woman 은 그러한 man 페이지가 없더라도 유효한 명령으로 간주됩니다.
  4. 유효하지 않은(존재하지 않는) 명령의 경우 Bash는 단순히 명령을 찾을 수 없다고 불평할 것입니다.
  5. 길이가 중요하다면 첫 번째 추천이 가장 짧습니다.

Dennis

true 에 대해 약간의 오해가 있는 것 같습니다. 보다 구체적으로 Bash가 대괄호 안의 표현식을 확장하고 해석하는 방법에 대해 설명합니다.

miku의 답변 에 있는 코드는 Bash 내장 true , /bin/true true 명령의 다른 풍미와 전혀 관련이 없습니다. 이 경우 true 는 단순한 문자열에 지나지 않으며 변수 할당이나 조건식 평가에 의해 true

다음 코드는 기능적으로 miku의 답변에 있는 코드와 동일합니다.

 the_world_is_flat=yeah if [ "$the_world_is_flat" = yeah ]; then echo 'Be careful not to fall off!' fi

여기서 유일한 차이점은 비교되는 네 문자가 't', 'r', 'u' 및 'e' 대신 'y', 'e', 'a' 및 'h'라는 점입니다. 그게 다야 라는 명령 또는 내장 전화를 만든 시도가 없습니다 yeah 배쉬 토큰 구문 분석 할 때에가는 특별한 처리의 모든 종류,도 (하츠네 미쿠의 예에서)이 true . 그것은 단지 문자열이며 완전히 임의의 것입니다.

업데이트(2014-02-19): miku의 답변에 있는 링크를 따라가니 이제 혼란이 어디에서 오는지 알 수 있습니다. Miku의 대답은 단일 대괄호를 사용하지만 그가 연결하는 코드 스니펫은 대괄호를 사용하지 않습니다. 그것은 단지:

 the_world_is_flat=true if $the_world_is_flat; then echo 'Be careful not to fall off!' fi

두 코드 조각 모두 같은 방식으로 작동 하지만 대괄호는 내부에서 일어나는 일을 완전히 바꿉니다.

각 경우에 Bash가 하는 일은 다음과 같습니다.

대괄호 없음:

  1. $the_world_is_flat 변수를 "true" 문자열로 확장합니다.
  2. "true" 를 명령으로 구문 분석하려고 시도합니다.
  3. true 명령(Bash 버전에 따라 /bin/true )을 찾아 실행합니다.
  4. true 명령의 종료 코드(항상 0임)를 0과 비교하십시오. 대부분의 쉘에서 종료 코드 0은 성공을 나타내고 나머지는 실패를 나타냅니다.
  5. 종료 코드가 0(성공)이므로 if 문의 then 절을 실행합니다.

괄호:

  1. $the_world_is_flat 변수를 "true" 문자열로 확장합니다.
  2. string1 = string2 형식의 이제 완전히 확장된 조건식을 구문 분석합니다. = 연산자는 bash의 문자열 비교 연산자입니다. 그래서...
  3. "true""true" 에 대해 문자열 비교를 수행합니다.
  4. 예, 두 문자열이 동일하므로 조건부의 값이 true입니다.
  5. if 문의 then 절을 실행합니다.

true 명령은 성공을 나타내는 종료 코드 0을 반환하기 때문에 대괄호가 없는 코드가 작동합니다. $the_world_is_flat = 오른쪽에 있는 문자열 리터럴 true 와 동일하기 때문에 괄호로 묶인 코드가 작동합니다.

포인트를 집으로 가져오기 위해 다음 두 코드 스니펫을 고려하십시오.

이 코드(루트 권한으로 실행하는 경우)는 컴퓨터를 재부팅합니다.

 var=reboot if $var; then echo 'Muahahaha! You are going down!' fi

이 코드는 "Nice try"를 출력합니다. 재부팅 명령이 호출되지 않습니다.

 var=reboot if [ $var ]; then echo 'Nice try.' fi

업데이트(2014-04-14) === 의 차이점에 대한 의견의 질문에 대답하려면 AFAIK에 차이가 없습니다. == = 에 대한 Bash 고유의 동의어이며 내가 본 한 모든 컨텍스트에서 정확히 동일하게 작동합니다.

[ ] 또는 [[ ]] 테스트에서 사용되는 === 문자열 비교 연산자에 대해 구체적으로 이야기하고 있다는 점에 유의하십시오. === 가 bash의 모든 곳 에서 상호 교환 가능하다고 제안하는 것은 아닙니다.

예를 들어, 당신은 분명히에 변수 할당 할 수없는 == 같은, var=="foo" 아니라 기술적으로이 작업을 수행 할 수 있습니다 (하지만 값 var 될 것 "=foo" 배쉬가 표시되지 않기 때문에, == 연산자는 = (할당) 연산자 다음에 리터럴 값 ="foo" 되며 이는 "=foo" 됩니다.

또한 === 는 상호 교환 가능하지만 이러한 테스트의 작동 방식 [ ] 또는 [[ ]] 내부에서 사용하는지 여부와 피연산자가 인용되는지 여부에 따라 다릅니다. 이에 대한 자세한 내용은 Advanced Bash Scripting Guide: 7.3 Other Comparison Operators === 대한 논의로 스크롤 다운)를 참조하십시오.


Mike Holt

산술식을 사용합니다.

 #!/bin/bash false=0 true=1 ((false)) && echo false ((true)) && echo true ((!false)) && echo not false ((!true)) && echo not true

산출:

진실
거짓이 아니다


Quolonel Questions

긴 이야기 요약:

Bash에는 부울이 없습니다.

truefalse 명령

Bash에는 비교 및 조건 측면에서 부울 표현식이 있습니다. 즉, Bash에서 선언하고 비교할 수 있는 것은 문자열과 숫자입니다. 그게 다야

true 또는 false 가 표시되는 곳마다 종료 코드에만 사용되는 문자열 또는 명령/내장입니다.

이 구문은 ...

 if true; then ...

본질적으로 ...

 if COMMAND; then ...

여기서 명령은 true 입니다. 명령이 종료 코드 0을 반환할 때마다 조건은 true입니다. truefalse 는 Bash 내장이며 때로는 해당 종료 코드를 반환하는 것 외에는 아무 작업도 수행하지 않는 독립 실행형 프로그램이기도 합니다.


if..then..fi 조건

대괄호 또는 test 명령을 사용할 때 해당 구문의 종료 코드에 의존합니다. [ ][[ ]] 또한 다른 것과 마찬가지로 명령/내장 기능임을 명심하십시오. 그래서 ...

 if [[ 1 == 1 ]]; then echo yes; fi

에 해당

 if COMMAND; then echo yes; fi

여기서 COMMAND [[ 매개변수 1 == 1 ]]

if..then..fi 구조는 단지 구문상의 설탕입니다. 동일한 효과를 위해 항상 이중 앰퍼샌드로 구분된 명령을 실행할 수 있습니다.

 [[ 1 == 1 ]] && echo yes

이러한 테스트 구성에서 truefalse 를 사용할 때 "true" 또는 "false" 문자열만 테스트 명령에 전달하는 것입니다. 다음은 예입니다.

믿거나 말거나 하지만 이러한 조건은 모두 동일한 결과를 낳습니다 .

 if [[ false ]]; then ... if [[ "false" ]]; then ... if [[ true ]]; then ... if [[ "true" ]]; then ...

TL;DR; 항상 문자열이나 숫자와 비교

미래의 독자들에게 이것을 명확히 하기 위해 저는 항상 truefalse 주위에 따옴표를 사용하는 것이 좋습니다.

하다

 if [[ "${var}" == "true" ]]; then ... if [[ "${var}" == "false" ]]; then ... if [[ "${var}" == "yes" ]]; then ... if [[ "${var}" == "USE_FEATURE_X" ]]; then ... if [[ -n "${var:-}" ]]; then echo "var is not empty" ...

하지마

 # Always use double square brackets in bash! if [ ... ]; then ... # This is not as clear or searchable as -n if [[ "${var}" ]]; then ... # Creates impression of Booleans if [[ "${var}" != true ]]; then ... # `-eq` is for numbers and doesn't read as easy as `==` if [[ "${var}" -eq "true" ]]; then ...

아마도

 # Creates impression of Booleans. # It can be used for strict checking of dangerous operations. # This condition is false for anything but the literal string "true". if [[ "${var}" != "true" ]]; then ...

Hubert Grzeskowiak

오래 전에 우리가 가진 모든 것이 sh test 프로그램의 규칙에 의존하여 처리된 부울에서는 test 가 잘못된 종료 상태를 반환합니다.

이렇게 하면 설정되지 않은 변수를 false로, 어떤 값으로든 설정된 변수를 true로 생각할 수 있습니다. 오늘 test 배쉬에 내장이며 일반적으로는 한 문자 별명으로 알려져있다 [ (또는 고인돌 노트, 그것은 부족한 쉘에서 사용하는 실행 파일) :

 FLAG="up or <set>" if [ "$FLAG" ] ; then echo 'Is true' else echo 'Is false' fi # Unset FLAG # also works FLAG= if [ "$FLAG" ] ; then echo 'Continues true' else echo 'Turned false' fi

[[ test 를 모방하지만 구문이 더 좋은 복합 명령을 사용하는 것을 선호합니다. 공백이 있는 변수는 인용할 필요가 없습니다. &&|| 사용할 수 있습니다. 이상한 우선 순위를 가진 논리 연산자로, 용어 수에 대한 POSIX 제한이 없습니다.

예를 들어, FLAG가 설정되고 COUNT가 1보다 큰 숫자인지 확인하려면:

 FLAG="up" COUNT=3 if [[ $FLAG && $COUNT -gt '1' ]] ; then echo 'Flag up, count bigger than 1' else echo 'Nope' fi

공백, 길이가 0인 문자열, null 변수가 모두 필요할 때와 스크립트가 여러 셸에서 작동해야 할 때 이 항목이 혼동될 수 있습니다.


Hbar

쉘 스크립트에서 부울 변수를 어떻게 선언하고 사용할 수 있습니까?

다른 많은 프로그래밍 언어와 달리 Bash는 "유형"으로 변수를 분리하지 않습니다. [1]

그래서 답은 아주 명확합니다. Bash 에는 부울 변수 가 없습니다.

하지만:

선언문을 사용하여 값 할당을 변수로 제한할 수 있습니다. [2]

 #!/bin/bash declare -ir BOOL=(0 1) # Remember BOOL can't be unset till this shell terminates readonly false=${BOOL[0]} readonly true=${BOOL[1]} # Same as declare -ir false=0 true=1 ((true)) && echo "True" ((false)) && echo "False" ((!true)) && echo "Not True" ((!false)) && echo "Not false"

declarereadonlyr 옵션 은 변수가 읽기 전용 임을 명시적으로 나타내는 데 사용됩니다. 목적이 분명하기를 바랍니다.


sjsam

부울을 가짜로 만들고 미래의 독자를 위해 함정을 남겨두는 대신 true와 false보다 더 나은 값을 사용하는 것이 어떻겠습니까?

예를 들어:

 build_state=success if something-horrible; then build_state=failed fi if [[ "$build_state" == success ]]; then echo go home; you are done else echo your head is on fire; run around in circles fi

Pyrolistical

내 발견과 제안은 다른 게시물과 약간 다릅니다. "후프 점프"가 제안되지 않고 "일반" 언어에서와 같이 기본적으로 "부울"을 사용할 수 있음을 발견했습니다...

[] 또는 명시적 문자열 비교가 필요하지 않습니다... 여러 Linux 배포판을 시도했습니다. Bash, Dash 및 BusyBox를 테스트했습니다. 결과는 항상 같았습니다. 원래 상위 투표 게시물이 무엇을 말하는지 잘 모르겠습니다. 시대가 변했고 그게 전부일까요?

변수를 true 설정하면 이후에 조건부 내에서 "긍정적"으로 평가됩니다. false 설정하면 "음수"로 평가됩니다. 매우 간단합니다! 유일한 주의 사항은 정의되지 않은 변수도 true 처럼 평가된다는 것입니다! (대부분의 언어에서 하는 것처럼) 반대로 하면 좋겠지만 그게 트릭입니다. 부울을 명시적으로 true 또는 false 로 초기화하기만 하면 됩니다.

왜 이런 식으로 작동합니까? 그 대답은 두 가지입니다. A) 셸에서 true/false는 실제로 "오류 없음" 대 "오류"(즉, 0 대 다른 것)를 의미합니다. B) 참/거짓은 값이 아니라 쉘 스크립팅의 명령문입니다! 실행, 두 번째 점에 대해서는 true 또는 false 그 값에있어 블록의 반환 값은 한 줄에 단독으로 설정, 즉 false 어디 진정한 "클리어"고, "오류가 발생"의 선언입니다. 변수에 할당과 함께 사용하면 변수로 "반환"됩니다. 정의되지 않은 변수는 0 또는 "오류 발생 없음"을 동일하게 나타내기 때문에 조건부에서 true

아래 예제 Bash 라인과 결과를 참조하십시오. 확인하려면 직접 테스트하십시오 ...

 #!/bin/sh # Not yet defined... echo "when set to ${myBool}" if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi; myBool=true echo "when set to ${myBool}" if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi; myBool=false echo "when set to ${myBool}" if ${myBool}; then echo "it evaluates to true"; else echo "it evaluates to false"; fi;

수확량

 when set to it evaluates to true when set to true it evaluates to true when set to false it evaluates to false

BuvinJ

많은 프로그래밍 언어에서 Boolean 유형은 정수의 하위 유형이거나 그렇게 구현됩니다. 여기서 true1 처럼 동작하고 false 0 처럼 동작합니다.

수학적 으로 부울 대수는 정수 산술 모듈로 2와 유사합니다. 따라서 언어가 기본 부울 유형을 제공하지 않는 경우 가장 자연스럽고 효율적인 솔루션은 정수를 사용하는 것입니다. 이것은 거의 모든 언어에서 작동합니다. 예를 들어 Bash에서 다음을 수행할 수 있습니다.

 # val=1; ((val)) && echo "true" || echo "false" true # val=0; ((val)) && echo "true" || echo "false" false

남자 배쉬 :

((표현))

표현식은 아래의 ARITHMETIC EVALUATION에 설명된 규칙에 따라 평가됩니다. 표현식의 값이 0이 아닌 경우 반환 상태는 0입니다. 그렇지 않으면 반환 상태는 1입니다. 이것은 let "expression"과 정확히 동일합니다.


Cyker

POSIX (휴대용 운영 체제 인터페이스)

여기서 나는 휴대성이라는 핵심 포인트를 놓치고 있다. 그래서 내 헤더 자체에 POSIX 가 있습니다.

기본적으로 투표된 모든 답변은 Bash 관련 항목이 너무 많다는 점을 제외하고 모두 정확합니다.

기본적으로 이식성에 대한 더 많은 정보를 추가하고 싶습니다.


  1. [ [ "$var" = true ] 와 같은 [ 및 ] 대괄호는 필요하지 않으며 생략하고 test 명령을 직접 사용할 수 있습니다.

     test "$var" = true && yourCodeIfTrue || yourCodeIfFalse

    중요 참고 사항: 천천히 더 이상 사용되지 않고 여러 명령문을 결합하는 것이 더 어렵기 때문에 더 이상 권장하지 않습니다.

  2. truefalse 이라는 단어가 쉘에 무엇을 의미하는지 상상하고 직접 테스트하십시오.

     echo $(( true ))
     0
     echo $(( false ))
     1

    그러나 따옴표 사용:

     echo $(( "true" ))
     bash: "true": syntax error: operand expected (error token is ""true"") sh (dash): sh: 1: arithmetic expression: expecting primary: ""true""

    다음과 같은 경우에도 마찬가지입니다.

     echo $(( "false" ))

    쉘은 문자열 이외의 것을 해석할 수 없습니다. 따옴표 없이 적절한 키워드를 사용하는 것이 얼마나 좋은지 알 수 있기를 바랍니다.

    그러나 아무도 이전 답변에서 말하지 않았습니다.

  3. 이것은 무엇을 의미 하는가? 글쎄, 몇 가지.

    • Boolean 키워드는 실제로 숫자처럼 취급됩니다. 즉, true = 0false = 1 입니다. false 로 취급된다는 점을 기억하십시오.

    • 그것들은 숫자로 취급되기 때문에 그것들도 그렇게 다루어야 합니다. 즉, 변수를 정의하는 경우 다음과 같이 말합니다.

       var_bool=true echo "$var_bool"
       true

      다음을 사용하여 반대 값을 만들 수 있습니다.

       var_bool=$(( 1 - $var_bool )) # same as $(( ! $var_bool )) echo "$var_bool"
       1

    직접 볼 수 있듯이 쉘은 true 문자열을 인쇄하지만 그 이후로는 모두 true 나타내는 0 또는 false 나타내는 1 통해 작동합니다.


마지막으로 그 모든 정보를 가지고 무엇을 해야 하는지

  • 첫째, 좋은 습관 중 하나 true 0 을 할당하는 것입니다. false 대신 1 .

  • 두 번째 좋은 습관은 변수가 0이 아닌지 테스트하는 것입니다.

     if [ "$var_bool" -eq 0 ]; then yourCodeIfTrue else yourCodeIfFalse fi

LinuxSecurityFreak

구문과 관련하여 이것은 부울 논리를 일관되고 건전하게 관리하기 위해 (예를 들어) 사용하는 간단한 방법론입니다.

 # Tests var= var='' var="" var=0 var=1 var="abc" var=abc if [[ -n "${var}" ]] ; then echo 'true' fi if [[ -z "${var}" ]] ; then echo 'false' fi # Results # var= # false # var='' # false # var="" # false # var=0 # true # var=1 # true # var="abc" # true # var=abc # true

변수가 선언되지 않은 경우 답은 다음과 같습니다. # false

따라서 (이 구문 방법론을 사용하여) 변수를 true로 설정하는 간단한 방법은 var=1 . 반대로 var='' .

참조:

-n = var string의 길이가 0이 아니면 참입니다.

-z = var string의 길이가 0이면 참입니다.


Eric P

Bill Parker는 그의 정의가 일반적인 코드 규칙과 반대이기 때문에 투표에서 부결되었습니다. 일반적으로 true는 0으로 정의되고 false는 0이 아닌 것으로 정의됩니다. 1은 9999 및 -1과 마찬가지로 false에 대해 작동합니다. 함수 반환 값과 동일합니다. 0은 성공이고 0이 아닌 것은 실패입니다. 죄송합니다. 저는 아직 투표를 하거나 그에게 직접 답장을 보낼 거리의 신뢰성이 없습니다.

Bash는 이제 단일 대괄호 대신 이중 대괄호를 습관으로 사용할 것을 권장하며 Mike Holt가 제공한 링크는 작동 방식의 차이점을 설명합니다. 7.3. 기타 비교 연산자

우선 -eq 는 숫자 연산자이므로 코드가

 #**** NOTE *** This gives error message ***** The_world_is_flat=0; if [ "${The_world_is_flat}" -eq true ]; then

정수 표현식을 기대하는 오류 문을 발행합니다. 둘 다 정수 값이 아니므로 이는 매개변수 중 하나에 적용됩니다. 그러나 이중 괄호를 둘러싸면 오류 구문이 발생하지 않지만 잘못된 값이 생성됩니다(가능한 순열의 50%). [[0 -eq true]] = 성공으로 평가되지만 [[0 -eq false]] = 성공으로도 평가됩니다. 이는 잘못된 것입니다(흠.... 내장 함수가 숫자 값인 것은 어떻습니까?).

 #**** NOTE *** This gives wrong output ***** The_world_is_flat=true; if [[ "${The_world_is_flat}" -eq true ]]; then

잘못된 출력을 제공하는 조건문의 다른 순열도 있습니다. 기본적으로 변수를 숫자 값으로 설정하고 참/거짓 내장과 비교하거나 변수를 참/거짓 내장으로 설정하고 수치와 비교하는 모든 것(위에 나열된 오류 조건 제외). 또한 변수를 true/false 내장으로 설정하고 -eq 사용하여 비교를 수행하는 모든 것. 따라서 -eq 를 피하고 부울 비교의 경우 숫자 값을 사용하지 마십시오. 다음은 잘못된 결과를 제공하는 순열에 대한 요약입니다.

 # With variable set as an integer and evaluating to true/false # *** This will issue error warning and not run: ***** The_world_is_flat=0; if [ "${The_world_is_flat}" -eq true ]; then # With variable set as an integer and evaluating to true/false # *** These statements will not evaluate properly: ***** The_world_is_flat=0; if [ "${The_world_is_flat}" -eq true ]; then # if [[ "${The_world_is_flat}" -eq true ]]; then # if [ "${The_world_is_flat}" = true ]; then # if [[ "${The_world_is_flat}" = true ]]; then # if [ "${The_world_is_flat}" == true ]; then # if [[ "${The_world_is_flat}" == true ]]; then # With variable set as an true/false builtin and evaluating to true/false # *** These statements will not evaluate properly: ***** The_world_is_flat=true; if [[ "${The_world_is_flat}" -eq true ]]; then # if [ "${The_world_is_flat}" = 0 ]; then # if [[ "${The_world_is_flat}" = 0 ]]; then # if [ "${The_world_is_flat}" == 0 ]; then # if [[ "${The_world_is_flat}" == 0 ]]; then

이제 작동합니다. 비교와 평가 모두에 true/false 내장 함수를 사용하십시오(Mike Hunt가 언급했듯이 따옴표로 묶지 마십시오). 그런 다음 단일 또는 이중 등호(= 또는 ==)와 단일 또는 이중 대괄호([ ] 또는 [[ ]])를 사용합니다. 개인적으로 저는 이중 등호를 좋아합니다. 다른 프로그래밍 언어의 논리적 비교를 떠올리게 하고 타이핑을 좋아하기 때문에 큰따옴표를 사용하기 때문입니다. 따라서 다음이 작동합니다.

 # With variable set as an integer and evaluating to true/false # *** These statements will work properly: ***** # The_world_is_flat=true/false; if [ "${The_world_is_flat}" = true ]; then # if [[ "${The_world_is_flat}" = true ]]; then # if [ "${The_world_is_flat}" = true ]; then # if [[ "${The_world_is_flat}" == true ]]; then

당신은 그것을 가지고 있습니다.


Randyman99

(내 자신의) 바보에 대한 내 레시피:

 # setting ---------------- commonMode=false if [[ $something == 'COMMON' ]]; then commonMode=true fi # using ---------------- if $commonMode; then echo 'YES, Common Mode' else echo 'NO, no Common Mode' fi $commonMode && echo 'commonMode is ON ++++++' $commonMode || echo 'commonMode is OFF xxxxxx'

Frank Nocke

다음은 나를 위해 작동하는 간단한 예입니다.

 temp1=true temp2=false if [ "$temp1" = true ] || [ "$temp2" = true ] then echo "Do something." else echo "Do something else." fi

Harsimranjit Singh Kler

if true 속기 구현입니다.

 # Function to test if a variable is set to "true" _if () { [ "${1}" == "true" ] && return 0 [ "${1}" == "True" ] && return 0 [ "${1}" == "Yes" ] && return 0 return 1 }

실시예 1

 my_boolean=true _if ${my_boolean} && { echo "True Is True" } || { echo "False Is False" }

실시예 2

 my_boolean=false ! _if ${my_boolean} && echo "Not True is True"

llundin

기존 답변이 혼란 스럽습니다.

개인적으로 C처럼 보이고 작동하는 것을 갖고 싶습니다.

이 스니펫은 프로덕션 환경에서 하루에 여러 번 작동합니다.

 snapshotEvents=true if ($snapshotEvents) then # Do stuff if true fi

모두를 행복하게 하기 위해 다음을 테스트했습니다.

 snapshotEvents=false if !($snapshotEvents) then # Do stuff if false fi

어느 쪽도 잘 작동했습니다.

$snapshotEvents 는 변수 값의 내용을 평가합니다. $ 가 필요합니다.

괄호는 별로 필요하지 않습니다. 그냥 도움이 될 뿐입니다.


will

다음은 변수가 설정되지 않은 경우에 대한 Dennis Williamson 의 우려를 해결하는 miku의 원래 답변에 대한 개선 사항입니다.

 the_world_is_flat=true if ${the_world_is_flat:-false} ; then echo "Be careful not to fall off!" fi

false 인지 테스트하려면 다음을 수행하십시오.

 if ! ${the_world_is_flat:-false} ; then echo "Be careful not to fall off!" fi

변수에 불쾌한 내용이 있는 다른 경우에 대해 이것은 프로그램에 공급되는 외부 입력의 문제입니다.

모든 외부 입력을 신뢰하기 전에 유효성을 검사해야 합니다. 그러나 해당 유효성 검사는 해당 입력이 수신될 때 한 번만 수행되어야 합니다.

Dennis Williamson이 제안한 것처럼 변수를 사용할 때마다 수행하여 프로그램의 성능에 영향을 줄 필요는 없습니다.


dolmen

shFlags 를 사용할 수 있습니다.

다음을 정의할 수 있는 옵션을 제공합니다. DEFINE_bool

예시:

 DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");

명령줄에서 다음을 정의할 수 있습니다.

 sh script.sh --bigmenu sh script.sh --nobigmenu # False

gogasca

부울을 사용하는 또 다른 방법은 값의 공백 을 테스트하는 것입니다. 이것은 더 짧은 테스트를 만드는 이점이 있습니다:

 first=1 # A true value second= # A false value [ -n "$first" ] && echo 'First var is true' [ -z "$first" ] && echo 'First var is false' [ -n "$second" ] && echo 'Second var is true' [ -z "$second" ] && echo 'Second var is false'

산출:

 First var is true Second var is false

다음은 bash를 사용한 대체 테스트 구문입니다. [[ -n $one ]]


yolenoyer

이것은 Bash에서 "부울" 값을 테스트하는 다양한 방법에 대한 속도 테스트입니다.

 #!/bin/bash rounds=100000 b=true # For true; b=false for false type -a true time for i in $(seq $rounds); do command $b; done time for i in $(seq $rounds); do $b; done time for i in $(seq $rounds); do [ "$b" == true ]; done time for i in $(seq $rounds); do test "$b" == true; done time for i in $(seq $rounds); do [[ $b == true ]]; done b=x; # Or any non-null string for true; b='' for false time for i in $(seq $rounds); do [ "$b" ]; done time for i in $(seq $rounds); do [[ $b ]]; done b=1 # Or any non-zero integer for true; b=0 for false time for i in $(seq $rounds); do ((b)); done

그것은 다음과 같은 것을 인쇄 할 것입니다

 true is a shell builtin true is /bin/true real 0m0,815s user 0m0,767s sys 0m0,029s real 0m0,562s user 0m0,509s sys 0m0,022s real 0m0,829s user 0m0,782s sys 0m0,008s real 0m0,782s user 0m0,730s sys 0m0,015s real 0m0,402s user 0m0,391s sys 0m0,006s real 0m0,668s user 0m0,633s sys 0m0,008s real 0m0,344s user 0m0,311s sys 0m0,016s real 0m0,367s user 0m0,347s sys 0m0,017s

jarno

대안 - 함수 사용

 is_ok(){ :;} is_ok(){ return 1;} is_ok && echo "It's OK" || echo "Something's wrong"

함수를 정의하는 것은 덜 직관적이지만 반환 값을 확인하는 것은 매우 쉽습니다.


johnraff

[ , [[ , (( , $(( ) 등) 문제를 실제로 혼동합니다.

모두 서로의 코드 공간을 밟고 있습니다. 나는 이것이 Bash가 때때로 sh 척해야 했던 대부분의 역사적이라고 생각합니다.

대부분의 경우 방법을 선택하고 고수할 수 있습니다. 이 경우에는 선언하는 경향이 있습니다(내 실제 스크립트에서 . 과 함께 포함할 수 있는 공통 라이브러리 파일에서 선호).

 TRUE=1; FALSE=0

(( ... )) 산술 연산자를 사용하여 이와 같이 테스트할 수 있습니다.

 testvar=$FALSE if [[ -d ${does_directory_exist} ]] then testvar=$TRUE; fi if (( testvar == TRUE )); then # Do stuff because the directory does exist fi
  1. 당신은 징계해야합니다. testvar $TRUE 또는 $FALSE 로 설정되어야 합니다.

  2. (( ... )) $ 가 필요하지 않으므로 더 읽기 쉽습니다.

  3. $TRUE=1$FALSE=0 , 즉 숫자 값이기 때문에 (( ... )) 사용할 수 있습니다.

  4. 단점은 가끔 $ 를 사용해야 한다는 것입니다.

     testvar=$TRUE

    너무 예쁘지 않은 것.

완벽한 솔루션은 아니지만 그러한 테스트에 필요한 모든 경우를 다룹니다.


Bill Parker

출처 : http:www.stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script

반응형