Program Tip

쉘 스크립트에서 부울 변수를 선언하고 사용하는 방법은 무엇입니까?

programtip 2020. 9. 28. 09:54
반응형

쉘 스크립트에서 부울 변수를 선언하고 사용하는 방법은 무엇입니까?


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

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 일 개정 이전의 의견은 원래 답변에만 해당되고 수정 된 답변과 관련하여 많은 의견이 틀 렸기 때문입니다. 예를 들어 true2010 년 6 월 2 일에 내장 bash 대한 Dennis Williamson의 의견은 수정 된 내용이 아닌 원래 답변에만 적용됩니다.


TL; DR

bool=true

if [ "$bool" = true ]

Miku의 ( 원래 ) 답변 문제

나는 받아 들여진 대답을 추천 하지 않는다 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으로이 예에서 "boolean"변수 가 명시 적으로 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")을 인용하거나 변수 ( "$var")를 인용 test하거나 또는 [[대신 또는를 사용 [하는 것은 차이가 없습니다.

내가 추천하는 것 :

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

bool=true

if [ "$bool" = true ]; then
if [ "$bool" = "true" ]; then

if [[ "$bool" = true ]]; then
if [[ "$bool" = "true" ]]; then
if [[ "$bool" == true ]]; then
if [[ "$bool" == "true" ]]; then

if test "$bool" = true; then
if test "$bool" = "true"; then

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


각주

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

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

miku의 답변 에있는 코드 는 Bash builtin 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

여기서 유일한 차이점은 비교되는 4 개의 문자가 't', 'r', 'u'및 'e'대신 'y', 'e', ​​'a'및 'h'라는 것입니다. 그게 다야. 명명 된 명령이나 내장 함수를 호출하려는 시도가 yeah없으며 Bash가 토큰을 구문 분석 할 때 진행되는 특수 처리 (miku의 예에서)도 없습니다 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명령 ( /bin/trueBash 버전에 따라 내장 또는)을 찾아 실행합니다 .
  4. true명령 의 종료 코드 (항상 0)를 0과 비교하십시오. 대부분의 셸에서 종료 코드 0은 성공을 나타내고 다른 것은 실패를 나타냅니다.
  5. 종료 코드가 0 (성공)이므로 if명령문의 then절을 실행하십시오 .

브래킷 :

  1. 변수 $the_world_is_flat를 문자열로 확장합니다 "true".
  2. 이제 완전히 확장 된 조건식을 구문 분석합니다 string1 = string2. =연산자는 bash는의이다 문자열 비교 연산자입니다. 그래서...
  3. "true"에서 문자열 비교를 수행하십시오 "true".
  4. 네, 두 문자열이 동일하므로 조건부의 값이 참입니다.
  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년 4월 14일가) 의 차이에 관한 의견의 질문에 대답하기 ===: AFAIK를, 차이가 없습니다. ==운영자를위한 Bash 전용의 동의어 =, 그리고 지금까지 내가 본대로, 그들은 모든 상황에서 정확히 같은 작동합니다.

그러나 특히 또는 테스트 에서 사용되는 ===문자열 비교 연산자 에 대해 이야기 하고 있습니다 . 나는 그 제안 아니에요 교환 할 수있다 사방 bash는.[ ][[ ]]===

예를 들어, 당신은 분명히에 변수 할당 할 수없는 ==등, var=="foo"물론 기술적으로는 ( 이렇게, 그러나의 값이 var될 것입니다 "=foo"배쉬가 표시되지 않기 때문에, ==여기 연산자를, 그것은 보는 것 =다음에, (할당) 연산자를 리터럴 값 ="foo"바로되고, "=foo").

하지만 또한, ===상호 교환이 테스트 작업 방법, 당신이 있다는 사실을 숙지 않습니다 당신이 내부에 그것을 사용하고 있는지에 따라 [ ]또는 [[ ]],도에 피연산자가 인용 여부. 이에 대한 자세한 내용은 Advanced Bash Scripting Guide : 7.3 Other Comparison Operators ( =논의로 스크롤 다운 ==)에서 확인할 수 있습니다.


산술 표현식을 사용하십시오.

#!/bin/bash

false=0
true=1

((false)) && echo false
((true)) && echo true
((!false)) && echo not false
((!true)) && echo not true

산출:


거짓이 아니라


짧은 이야기 :

Bash에는 부울이 없습니다.

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

어디든지 당신이 볼 true또는 falsebash는, 그것은 문자열이나에만 종료 코드에 사용되는 명령 / 내장 중 하나입니다.

이 구문은 ...

if true; then ...

본질적으로 ...

if COMMAND; then ...

명령 반환 종료 코드 0 때마다 조건이 사실 true과는 false아무 만, 해당 종료 코드를 반환 할 없습니다 배쉬 내장 명령과 때로는 독립 프로그램입니다.

위의 조건은 다음과 같습니다.

COMMAND && ...

대괄호 또는 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; 항상 문자열 또는 숫자와 비교

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

하다

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

하지마

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

아마도

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

오래 전 우리가 가진 모든 것이 였을 때 sh, 인수없이 실행하면 거짓 종료 상태를 반환하는 test프로그램 의 규칙에 의존하여 처리되는 부울 test입니다. 이를 통해 false로 설정되지 않은 변수와 true로 설정된 변수를 생각할 수 있습니다. 오늘날 test는 기본 제공되며 bash일반적으로 하나의 문자 별칭 [(또는 dolmen이 언급 한 것처럼이 기능이없는 쉘에서 사용할 실행 파일 )으로 알려져 있습니다.

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="u p"
COUNT=3

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

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


쉘 스크립트에서 부울 변수를 선언하고 사용하는 방법은 무엇입니까?

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

그래서 대답은 아주 분명합니다. boolean variablebash 에는 없습니다 . 그러나 :

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

#!/bin/bash
declare -ir BOOL=(0 1) #remember BOOL can't be unset till this shell terminate
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"

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


부울을 속이고 미래의 독자를 위해 함정을 남기는 대신 참과 거짓보다 더 나은 값을 사용하는 것이 어떻습니까?

예를 들면 :

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

POSIX (Portable Operating System Interface)

여기서 중요한 점, 즉 이식성이 그리워요. 그것이 내 헤더에 POSIX가 있는 이유 입니다.

본질적으로 투표 된 모든 답변은 정확합니다. 단, BASH에 너무 많이 적용 되는 경우는 예외 입니다.

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


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

    test "${var}" = true && CodeIfTrue || CodeIfFalse
    

    참고 것을 나는 더 이상이 권장하지 가 천천히 사용되지 것 같이.

  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. 이것은 무엇을 의미 하는가? 글쎄, 몇 가지.

    • 부울 키워드는 실제로 숫자처럼 처리됩니다. 즉 true= 0false= 1, 0이 아닌 모든 값은 false.

    • 그것들은 숫자처럼 취급되기 때문에 그것들도 마찬가지로 취급해야합니다.

      var_bool=true
      echo "${var_bool}"
      
       true
      

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

      var_bool=$(( 1 - ${var_bool} ))
      echo "${var_bool}"
      
      1
      

      보시다시피 쉘은 true처음 사용할 때 문자열을 인쇄 하지만 그 이후로 모두 숫자를 0나타내는 true또는 1나타내는 false각각을 통해 작동합니다 .


마지막으로 모든 정보로해야 할 일

  • 첫째, 한 가지 좋은 습관은 0대신 할당하는 것입니다 true. 1대신 false.

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

    if [ "${var_bool}" -eq 0 ]; then YourCodeIfTrue; else YourCodeIfFalse; fi
    

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

잘못된 출력을 제공하는 조건부의 다른 순열도 있습니다. 기본적으로 변수를 숫자 값으로 설정하고 참 / 거짓 내장과 비교하거나 변수를 참 / 거짓 내장으로 설정하고 숫자 값과 비교하는 모든 것 (위에 나열된 오류 조건 제외)입니다. 또한 변수를 참 / 거짓 내장으로 설정하고 -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

이제 작동하는 것입니다. 비교와 평가 모두에 참 / 거짓 내장을 사용하십시오 (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

거기에 있습니다.


많은 프로그래밍 언어에서 부울 유형은 정수의 하위 유형이거나 다음 true과 같이 작동하고 다음 1false같이 작동 하는 정수의 하위 유형으로 구현됩니다 0.

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

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

남자 배쉬 :

((표현))

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


내 결과와 제안은 다른 게시물과 약간 다릅니다. "후프 점프"를 제안하지 않고 "일반"언어에서 기본적으로 true / false를 사용할 수 있음을 발견했습니다. [] 또는 명시 적 문자열 비교가 필요하지 않습니다. 여러 Linux 배포판을 사용해 보았습니다. 테스트했습니다. bash, dash 및 busybox. 나는 그녀를 강타하거나하지 않고 달렸다. 결과는 항상 같았다. 원래 최고 투표 게시물이 무엇에 대해 이야기하고 있는지 잘 모르겠습니다. 아마도 시대가 바뀌었고 그게 전부입니까?

변수를로 설정 true하면 조건부에서 true로 평가됩니다. 로 설정하면 falsefalse로 평가됩니다. 매우 간단합니다! 유일한주의 사항은 UNDEFINED 변수도 true로 평가된다는 것 입니다 ! 반대로하면 좋겠지 만 그게 트릭 입니다. 부울을 명시 적으로 true 또는 false로 설정하면 됩니다.

아래의 예제 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

다음은 저에게 적합한 간단한 예입니다.

temp1=true
temp2=false

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

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

개인적으로 저는 C처럼 보이고 작동하는 무언가를 원합니다.

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

snapshotEvents=true

if ($snapshotEvents)
then
    # do stuff if true
fi

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

snapshotEvents=false

if !($snapshotEvents)
then
    # do stuff if false
fi

또한 잘 작동했습니다.

$snapshotEvents변수의 값의 내용을 평가한다. 따라서 $.

괄호는 실제로 필요하지 않습니다. 도움이 될뿐입니다.


다음은 변수가 설정되지 않은 경우에 대한 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이 제안한 것과 같은 변수의 모든 사용에 대해 수행함으로써 프로그램의 성능에 영향을 미칠 필요가 없습니다 .


다음은 속기 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"

GFlags를 사용할 수 있습니다 : https://gflags.github.io/gflags/

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

예:

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

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

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

대안-기능 사용

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

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


강타는 정말의 좋아하는 함께 문제를 혼동 [, [[, ((, $((, 등

모두 서로의 코드 공간을 처리합니다. 나는 이것이 대부분 역사적이라고 생각하는데, 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
    

    그렇게 예쁘지 않습니다.

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

참고 URL : https://stackoverflow.com/questions/2953646/how-to-declare-and-use-boolean-variables-in-shell-script

반응형