Programming

Bash 함수에서 부울 리턴

procodes 2020. 5. 17. 21:47
반응형

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" ]
}

250 개 이상의 공감대가 있음에도 불구하고 내가 말하는 것을 신경 써야하는 이유

그것은 것이 아니다 0 = true1 = false. 그것은이다 제로 수단없이 실패 (성공)비 - 제로 수단 장애 (N 형의) .

그동안 선택 대답은 기술적으로 "참" 제발 넣지 마십시오 return 1에 대한 코드에서 ** 거짓 . 불행한 부작용이 몇 가지 있습니다.

  1. 숙련 된 개발자가 당신을 아마추어로 여기게됩니다 (아래 이유로).
  2. 숙련 된 개발자는이 작업을 수행하지 않습니다 (아래의 모든 이유로).
  3. 오류가 발생하기 쉽습니다.
    • 숙련 된 개발자조차도 위와 같은 이유로 0과 1을 각각 false와 true로 오인 할 수 있습니다.
  4. 그것은 외롭고 우스운 의견을 요구하거나 장려 할 것이다.
  5. 실제로 암시 적 반환 상태보다 유용하지 않습니다.

배쉬 배우기

bash는 설명서가 말한다 (강조 광산)

반환 [n]

쉘 함수가 실행을 중지하고 호출자에게 n 값을 리턴하십시오. n이 제공되지 않으면 리턴 값은 함수에서 마지막으로 실행명령종료 상태입니다 .

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

bash 매뉴얼 은 또한 말합니다

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

bash 매뉴얼 은 또한 말합니다

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

우와, 기다려 관로? bash 매뉴얼을 한번 더 봅시다 .

A pipeline is a sequence of one or more commands separated by one of the control operators ‘|’ or ‘|&’.

Yes. They said 1 command is a pipeline. Therefore, all 3 of those quotes are saying the same thing.

  • $? tells you what happened last.
  • It bubbles up.

My answer

So, while @Kambus demonstrated that with such a simple function, no return is needed at all. I think was unrealistically simple compared to the needs of most people who will read this.

Why return?

If a function is going to return its last command's exit status, why use return at all? Because it causes a function to stop executing.

Stop execution under multiple conditions

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

What we have here is...

Line 04 is an explicit[-ish] return true because the RHS of && only gets executed if the LHS was true

Line 09 returns either true or false matching the status of line 08

Line 13 returns false because of line 12

(Yes, this can be golfed down, but the entire example is contrived.)

Another common pattern

# 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

Notice how setting a status variable demystifies the meaning of $?. (Of course you know what $? means, but someone less knowledgeable than you will have to Google it some day. Unless your code is doing high frequency trading, show some love, set the variable.) But the real take-away is that "if not exist status" or conversely "if exit status" can be read out loud and explain their meaning. However, that last one may be a bit too ambitious because seeing the word exit might make you think it is exiting the script, when in reality it is exiting the $(...) subshell.


** If you absolutely insist on using return 1 for false, I suggest you at least use return 255 instead. This will cause your future self, or any other developer who must maintain your code to question "why is that 255?" Then they will at least be paying attention and have a better chance of avoiding a mistake.


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

Be careful when checking directory only with option -d !
if variable $1 is empty the check will still be successfull. To be sure, check also that the variable is not empty.

#! /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

It might work if you rewrite this function myfun(){ ... return 0; else return 1; fi;} as this function myfun(){ ... return; else false; fi;}. That is if false is the last instruction in the function you get false result for whole function but return interrupts function with true result anyway. I believe it's true for my bash interpreter at least.


Use the true or false commands immediately before your return, then return with no parameters. The return will automatically use the value of your last command.

Providing arguments to return is inconsistent, type specific and prone to error if you are not using 1 or 0. And as previous comments have stated, using 1 or 0 here is not the right way to approach this function.

#!/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

Output:

$ bash bash_return.sh

cat:
- True
hat:
- False

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

반응형