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 = true
및 1 = false
. 그것은이다 제로 수단없이 실패 (성공) 및 비 - 제로 수단 장애 (N 형의) .
그동안 선택 대답은 기술적으로 "참" 제발 넣지 마십시오 return 1
에 대한 코드에서 ** 거짓 . 불행한 부작용이 몇 가지 있습니다.
- 숙련 된 개발자가 당신을 아마추어로 여기게됩니다 (아래 이유로).
- 숙련 된 개발자는이 작업을 수행하지 않습니다 (아래의 모든 이유로).
- 오류가 발생하기 쉽습니다.
- 숙련 된 개발자조차도 위와 같은 이유로 0과 1을 각각 false와 true로 오인 할 수 있습니다.
- 그것은 외롭고 우스운 의견을 요구하거나 장려 할 것이다.
- 실제로 암시 적 반환 상태보다 유용하지 않습니다.
배쉬 배우기
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
'Programming' 카테고리의 다른 글
외곽선과 테두리의 차이점 (0) | 2020.05.18 |
---|---|
시퀀스로 시작하지 않는 문자열에 대한 정규식 (0) | 2020.05.18 |
단일 값으로 C # 배열을 채우거나 인스턴스화하는 방법은 무엇입니까? (0) | 2020.05.17 |
Microsoft.Jet.OLEDB.4.0 '공급자가 로컬 컴퓨터에 등록되어 있지 않습니다 (0) | 2020.05.17 |
Python에서 Pearson 상관 관계 및 의미 계산 (0) | 2020.05.17 |