programing

Bash 함수에서 부울 반환

megabox 2023. 4. 14. 21:34
반응형

Bash 함수에서 부울 반환

파일에 특정 속성이 있는지 확인하고 true 또는 false를 반환하는 bash 함수를 쓰고 싶습니다.그러면 "if"에서 스크립트에 사용할 수 있습니다.하지만 뭘 돌려줘야 하죠?

function myfun(){ ... return 0; else return 1; fi;}

이렇게 씁니다.

if myfun filename.txt; then ...

물론 이것은 효과가 없습니다.어떻게 하면 좋을까요?

true에는 0, false에는 1을 사용합니다.

샘플:

#!/bin/bash

isdirectory() {
  if [ -d "$1" ]
  then
    # 0 = true
    return 0 
  else
    # 1 = false
    return 1
  fi
}


if isdirectory $1; then echo "is directory"; else echo "nopes"; fi

편집

@amichair님의 코멘트로도 가능합니다.

isdirectory() {
  if [ -d "$1" ]
  then
    true
  else
    false
  fi
}


isdirectory() {
  [ -d "$1" ]
}

더 높은 투표율 답변이 있음에도 불구하고 왜 내 말에 신경써야 하는가?

0 = true ★★★★★★★★★★★★★★★★★」1 = false, 0은 실패(성공)가 없음을 의미하고 0이 아닌 것은 실패(타입 N)의미합니다.

선택한 답변이 기술적으로 '참'인 경우, 이 답변에 대해 언급하지 말아 주세요.return 1** 당신의 코드에 거짓으로 입력해 주세요.그것은 몇 가지 불행한 부작용을 가져올 것이다.

  1. 경험이 풍부한 개발자가 아마추어를 발견하게 됩니다(아래의 이유).
  2. 경험이 풍부한 개발자는 이것을 실시하지 않습니다(아래의 모든 이유로).
  3. 에러가 발생하기 쉽습니다.
  • 경험이 풍부한 개발자라도 0과 1을 각각 false와 true로 착각할 수 있습니다(위의 이유로).
  1. 그것은 무관하고 터무니없는 코멘트를 요구한다(혹은 장려할 것이다).
  2. 암묵적인 리턴 상태보다 실제로는 도움이 되지 않습니다.

배시를 배우다

bash 매뉴얼에는 (내 것을 강조)라고 되어 있다.

반환 [n]

셸 함수의 실행을 중지하고 값 n을 호출자에게 반환합니다.n이 지정되지 않은 경우 반환값은 함수에서 마지막으로 실행된 명령어의 종료 상태가 됩니다.

따라서 True와 False를 나타내기 위해 0과 1을 사용할 필요가 없습니다.그들이 그렇게 한다는 사실은 본질적으로 코드 디버깅, 인터뷰 질문, 신입사원의 마음을 사로잡는 데만 유용한 사소한 지식이다.

bash 매뉴얼에 따르면

그렇지 않으면 함수의 반환 상태는 마지막으로 실행된 명령어의 종료 상태입니다.

bash 매뉴얼에 따르면

($?) 가장 최근에 실행된 포그라운드 파이프라인의 종료 상태로 확장됩니다.

우와, 잠깐만.파이프라인?다시 한 번 bash 매뉴얼을 살펴봅시다.

파이프라인은 컨트롤 연산자 '|' 또는 '|&' 중 하나로 구분된 하나 이상의 명령어 시퀀스입니다.

네, 1개의 명령어는 파이프라인이라고 했어요그 때문에, 그 3개의 견적은 모두 같은 것을 나타내고 있습니다.

  • $?마지막으로 무슨 일이 있었는지 말해주지
  • 거품이 일다.

나의 대답

@Kambus는 이러한 간단한 기능으로 증명했지만,return꼭 필요합니다.이 글을 읽을 대부분의 사람들이 필요로 하는 것에 비해 비현실적으로 간단하다고 생각한다.

★★★★return

상태를 , 왜 " " " 를 사용해야 ?return?? 왜냐하면 의 실행이입니다.왜냐하면 함수의 실행을 정지시키기 때문입니다.

여러 조건에서 실행 중지

01  function i_should(){
02      uname="$(uname -a)"
03
04      [[ "$uname" =~ Darwin ]] && return
05
06      if [[ "$uname" =~ Ubuntu ]]; then
07          release="$(lsb_release -a)"
08          [[ "$release" =~ LTS ]]
09          return
10      fi
11
12      false
13  }
14
15  function do_it(){
16      echo "Hello, old friend."
17  }
18
19  if i_should; then
20    do_it
21  fi

여기 있는 건...

»04가 true이므로 [-입니다.&&LHS를 사용합니다.

»09 중 가 회선의 됩니다.true 또는 false 입니다.08

»13이 false이므로 됩니다.12

(네, 이것은 골프 다운이 가능하지만, 그 예 전체가 계획되어 있습니다).

또 다른 일반적인 패턴

# Instead of doing this...
some_command
if [[ $? -eq 1 ]]; then
    echo "some_command failed"
fi

# Do this...
some_command
status=$?
if ! (exit $status); then
    echo "some_command failed"
fi

「 」의 설정 .status은 variable의 .$?)$?하지만 당신보다 지식이 부족한 사람이 언젠가 구글에서 검색해야 할 겁니다.코드가 고주파수 거래를 하지 않는 한 사랑을 보여주고 변수를 설정하십시오.)그러나 진정한 의미는 "종료 상태가 아니라면" 또는 반대로 "종료 상태라면"을 소리내어 읽고 그 의미를 설명할 수 있다는 것입니다.하지만 마지막은 너무 야심이 강할 수도 있어요. 왜냐하면 그 단어를 보면exit 있는 .실제로 이 스크립트는 이 스크립트를 종료하고 있는 것입니다.(...) 명령어 그룹 서브셸.


꼭 **를 return 1틀렸다면, 적어도 사용하시길 권합니다.return 255★★★가 있는 「왜 255요?」라고하게 됩니다.이것에 의해, 장래의 자신이나 코드를 관리할 필요가 있는 다른 개발자는, 「왜 255인가」라고 질문하게 됩니다.그러면 적어도 주의를 기울이고 "1=참, 0=거짓" 실수를 피할 수 있는 더 나은 기회를 얻을 수 있습니다.

myfun(){
    [ -d "$1" ]
}
if myfun "path"; then
    echo yes
fi
# or
myfun "path" && echo yes

-dd! 만 .
변수 $1이 비어 있으면 체크는 계속 성공합니다.확실히 하기 위해 변수가 비어 있지 않은지 확인하십시오.

#! /bin/bash

is_directory(){

    if [[ -d $1 ]] && [[ -n $1 ]] ; then
        return 0
    else
        return 1
    fi

}


#Test
if is_directory $1 ; then
    echo "Directory exist"
else
    echo "Directory does not exist!" 
fi

하다를 사용하세요.true ★★★★★★★★★★★★★★★★★」false를 명령어 직전에 합니다.return , , , 「 」return파라미터를 지정하지 않습니다.return는 마지막 명령어 값을 자동으로 사용합니다.

" " 에 제공return일관성이 없습니다.1 01 을 하지 않는 는, 이 있습니다.그리고 앞서 언급했듯이, 여기서 1 또는 0을 사용하는 것은 이 함수에 접근하는 올바른 방법이 아닙니다.

#!/bin/bash

function test_for_cat {
    if [ "$1" = "cat" ];
    then
        true
        return
    else
        false
        return
    fi
}

for i in cat hat;
do
    echo "${i}:"
    if test_for_cat "${i}";
    then
        echo "- True"
    else
        echo "- False"
    fi
done

출력:

$ bash bash_return.sh

cat:
- True
hat:
- False

코드 판독성을 위해 true/false를 반환하는 것은 다음과 같습니다.

  • 한통속이다
  • 하나의 명령어이다
  • 기억하기 쉽다
  • return에 또 다른 키워드)가 .true ★★★★★★★★★★★★★★★★★」false)

의 해결방법은 해 my my my my my입니다.return $(true) ★★★★★★★★★★★★★★★★★」return $(false)다음과 같이 합니다.

is_directory()
{
    if [ -d "${1}" ]; then
        return $(true)
    else
        return $(false)
    fi
}

나는 비틀거리던 한 점에 부딪쳤다.즉, 부울을 반환하는 방법이 아니라 올바르게 평가하는 방법입니다.

to i i라고 말하려고 .if [ myfunc ]; then ...츠키노래!킷!!!!!!!!!!!if myfunc; then ...그게 방법이야.

@ @Bruno ated른른른 @Bruno라고 하는 말이 .true ★★★★★★★★★★★★★★★★★」false이 아니라 명령입니다!이는 셸 스크립트에서 부울을 이해하는 데 매우 중요합니다.

이 투고에서는 부울 변수인 https://stackoverflow.com/a/55174008/3220983을 사용하여 설명하고 시연했습니다.그것은 매우 밀접하게 관련되어 있기 때문에, 확인해 주세요.

여기에서는 함수에서 부란을 반환하고 평가하는 예를 몇 가지 제시하겠습니다.

이것은, 다음과 같습니다.

test(){ false; }                                               
if test; then echo "it is"; fi                                 

즉,)false false를 반환한다)

test(){ true; }                                                
if test; then echo "it is"; fi                                 

작성:

it is                                                        

(예:)true true를 반환한다)

그리고.

test(){ x=1; }                                                
if test; then echo "it is"; fi                                 

작성:

it is                                                                           

0(즉, true)이 암묵적으로 반환되었기 때문입니다.

이게 날 망친 거야

test(){ true; }                                                
if [ test ]; then echo "it is"; fi                             

작성:

it is                                                                           

그리고.

test(){ false; }                                                
if [ test ]; then echo "it is"; fi                             

생산량:

it is                                                                           

여기서 괄호를 사용하면 잘못된 양성이 생성됩니다. ("outer" 명령 결과는 0으로 추정됩니다.)

제 글의 주요 요점은 일반적인 등식 검사에서처럼 부울 함수(또는 변수)를 평가하기 위해 대괄호를 사용하지 말라는 것입니다.

@Bruno Bronosky와 @mrteatime에 이어 부울 리턴을 "backwards"로 쓰라고 제안합니다.제 말은 이렇습니다.

foo()
{
    if [ "$1" == "bar" ]; then
        true; return
    else
        false; return
    fi;
}

이것에 의해, 모든 리턴 스테이트먼트에 대해서, 보기 흉한 2 행의 요건이 없어집니다.

함수 출력을 테스트하기 위한 가장 짧은 형식을 찾았습니다.

do_something() {
    [[ -e $1 ]] # e.g. test file exists
}

do_something "myfile.txt" || { echo "File doesn't exist!"; exit 1; }

「」를 고쳐 , 가 있습니다.function myfun(){ ... return 0; else return 1; fi;}와 같이function myfun(){ ... return; else false; fi;}, ,의 경우false는 함수 수 입니다.return인터럽트는 어쨌든 진정한 결과로 기능합니다.적어도 제 bash 통역에게는 맞는 말이라고 생각합니다.

다음은 테스트할 수 있는 테스트 사례와 관련된 몇 가지 좋은 예입니다.

기능에 는, 「」로 문의해 주세요.true/false 또는 ""를 사용합니다.true; return리리끝끝끝끝끝

function is_true() { true; }

if is_true; then echo 'true is true'; fi
if ! is_true; then exit; else echo '! true is ! true'; fi

function is_false() { false; }

if ! is_false; then echo 'false is false'; fi
if is_false; then exit; else echo '! false is ! false'; fi

즉시 반환할 수 없는 경우 반환 값을 변수에 저장합니다.(true; echo $?)변수를 설정하는 동안.이는 중첩된 함수에도 적용됩니다(다음 절 참조).

function from_var() {
        local input=$1
        local my_var
        if ((input == 1)); then
                my_var=$(true; echo $?)
        else
                my_var=$(false; echo $?)
        fi
        echo 'ignore this line'
        (exit $my_var)
}

if from_var 1; then echo "return true is true"; else exit; fi
if from_var 0; then exit; else echo "return false is false"; fi

해야 할 콜을 " " "로 ./dev/null또는 그 결과에는 다음 문자열이 포함될 수 있습니다.echo또는 기타 명령어. 점에 주의:(exit $rval) if할 수 있습니다으로는 반환값을 올바르게 해석할 수 있습니다.if (($rval)) ★★★★★★★★★★★★★★★★★」if [ $rval ]가 예상대로 동작하지 않습니다.

# Return a truthy result
rval=$(from_var 1 >/dev/null; echo $?)
if (exit $rval); then echo "return true as variable is true"; else exit; fi

# Return a falsy result
rval=$(from_var 0 >/dev/null; echo $?)
if (exit $rval); then exit; else echo "return false as variable is false"; fi

이 코드의 전체 출력은 다음과 같습니다.

true is true
! true is ! true
false is false
! false is ! false
ignore this line
return true is true
ignore this line
return false is false
return true as variable is true
return false as variable is false

> /dev/null저시

from_var 0; rval="$?"

언급URL : https://stackoverflow.com/questions/5431909/returning-a-boolean-from-a-bash-function

반응형