파일에 특정 속성이 있는지 확인하고 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 매뉴얼을 한번 더 봅시다 .
파이프 라인은 제어 연산자 ‘|’중 하나로 분리 된 하나 이상의 명령 시퀀스입니다. 또는 ‘| &’.
예. 그들은 1 개의 명령이 파이프 라인이라고 말했다. 그러므로,이 인용문들 모두가 같은 말을하고 있습니다.
$?
마지막에 일어난 일을 알려줍니다.- 거품이 일어납니다.
내 대답
따라서 @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
우리가 여기있는 것은 …
LHS가 true 인 경우에만 04
RHS &&
가 실행 되므로 Line 은 명시적인 [-ish] 리턴 true 입니다.
라인 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
변수를 설정하면 의 의미를 어떻게 알 수 있는지 확인 하십시오 $?
. (물론 당신은 무슨 $?
의미 인지 알지만 언젠가는 구글보다 지식이 부족한 사람이 있습니다. 코드가 고주파 거래를하지 않는 한, 사랑을 보여주고 변수를 설정하십시오.) 그러나 실제로 테이크 아웃은 “만약 존재하지 않음 “또는 반대로”종료 상태 인 경우 “를 크게 읽고 의미를 설명 할 수 있습니다. 그러나 마지막 단어 exit
는 너무 야심적 일 수 있습니다. 단어 를 보면 실제로 스크립트가 종료되고 $(...)
서브 쉘 이 종료 될 때 스크립트를 종료한다고 생각할 수 있습니다 .
** 당신 return 1
이 거짓 을 절대적으로 사용한다고 주장한다면 , 적어도 return 255
대신 사용 하는 것이 좋습니다 . 이로 인해 미래의 자기 자신이나 코드를 유지해야하는 다른 개발자가 “왜 255입니까?” 그러면 그들은 적어도주의를 기울이고 실수를 피할 수있는 더 좋은 기회를 갖게 될 것입니다.
답변
myfun(){
[ -d "$1" ]
}
if myfun "path"; then
echo yes
fi
# or
myfun "path" && echo yes
답변
-d 옵션으로 만 디렉토리를 검사 할 때주의하십시오!
변수 $ 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
답변
나는 내가 넘어 뜨리고있는 점 (명백하게 아직 언급되지 않았는가)을 만났다. 즉, 부울 을 리턴 하는 방법이 아니라 올바르게 평가하는 방법입니다.
나는 말하려고 if [ myfunc ]; then ...
했지만 그것은 잘못입니다. 대괄호를 사용해서는 안됩니다! if myfunc; then ...
그렇게하는 방법입니다.
에 따라 @Bruno 등은 반복, true
하고 false
있는 명령 하지 값! 쉘 스크립트에서 부울을 이해하는 것이 매우 중요합니다.
이 게시물에서 나는 설명과 부울 사용하여 시연 변수를 : https://stackoverflow.com/a/55174008/3220983 . 밀접하게 관련되어 있기 때문에 확인하는 것이 좋습니다.
다음 은 함수에서 부울을 반환하고 평가 하는 몇 가지 예를 제공 합니다.
이:
test(){ false; }
if test; then echo "it is"; fi
에코 출력이 없습니다. (즉, 거짓을 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
여기에 괄호를 사용하여 오 탐지가 발생했습니다 ! ( “외부”명령 결과는 0이라고 추측합니다.)
내 게시물에서 가장 중요한 것은 다음과 같습니다. 괄호를 사용하여 일반적인 평등 검사와 같은 부울 함수 (또는 변수)를 평가하지 마십시오 if [ x -eq 1 ]; then...
.
답변
사용 true
또는 false
즉시 전에 명령을 return
다음 return
매개 변수없이. 는 return
마지막 명령의 값을 자동으로 사용합니다.
인수를 제공하는 return
것은 일관성이없고, 유형에 따라 다르며 1 또는 0을 사용하지 않는 경우 오류가 발생하기 쉽습니다. 이전 의견에서 언급했듯이 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
답변
이것을 this function myfun(){ ... return 0; else return 1; fi;}
로 다시 작성하면 작동 할 수 있습니다
function myfun(){ ... return; else false; fi;}
. 그것은 false
함수의 마지막 명령어라면 전체 함수에 대해 잘못된 결과를 얻지 만 return
어쨌든 진정한 결과로 함수를 중단합니다. 내 배쉬 인터프리터에게는 적어도 사실이라고 생각합니다.