2014-10-07 1 views
2

가정하자 나는 두 개의 매개 변수를 true 또는 false를 반환하는 함수 foo, 나는이bash는 테스트 내부 매개 변수 기능을 가지고하는 방법 [

처럼, bash는 테스트 [명령 내에서 어떤 것을 사용하고자하는이
param1=one 
param2=two 
if [ foo $param1 $param2 ]; then 
    do something 
fi 

나는

if foo $param1 $param2; then ..... 

, 문제는이 같은 []을 사용하여 작동합니다 알고하지만 []에서 함께 사용하고 싶습니다.

+0

명령의 출력 코드 또는 반환 할 내용은 무엇입니까? – fedorqui

+2

(종료 상태를 사용하여) 대괄호없이 작동하는 경우,'test' 명령으로 실행할 필요가 없습니다. – chepner

+0

** 왜'test'에서 ** 사용 하시겠습니까? 종료 상태가 아닌 출력을 내보내는 지 테스트하려고합니까? –

답변

3

종료 상태 여부를 당신의 명령은 성공 또는 실패를 나타내며 대괄호를 완전히 버립니다. 그 유스 케이스에서 test 명령을 사용하는 것은 잘못되어 완전히 멈춘다. 이 경우

,

if foo "$param1" "$param2"; then ...; fi 

불필요 비효율적 유일한 올바른 구문이다. 그것은 당신의 서브 프로세스 내부 $?을 방출하고, 그 사용 test의 출력을 확인,과 같이 할 확실히 있어


:

if [ "$(foo "$param1" "$param2" >&2; echo "$?")" -eq 2 ]; then ...; fi 

... 그러나 다시보고 다시 "불필요하게 비효율적" ; 이것은 다음과 같이 작성하는 것이 더 낫습니다.

foo "$param1" "$param2"; retval=$? 
if [ $retval -eq 2 ]; then ...; fi 

... 불필요한 서브 쉘의 모든 오버 헤드를 피하십시오.


당신은 당신의 명령의 출력 표준 UNIX는 그들이 무엇인지 찾을 수 있는지, 제대로 작동 여부를 표시 할 수 있습니다 명령을 대부분으로, 바람직하지 않은/불필요한 동작을 일반적으로 (비 비어 있는지 여부를 테스트하려면 종료 상태를 통해 검색하는 등의 작업) :

if [ -n "$(foo "$param1" "$param2")" ]; then ...; fi 

이 맞습니다. 명심해야 할


하나 개 중요한 것은 - $()의 사용은 부모 쉘 (및 업데이트 또는 쉘의 상태를 수정하는 것이 가능) 서브 쉘로의 내부 실행 함수를 이동합니다. 따라서 함수가 변수 또는 상태를 쉘 내부에서 변경해야하는 경우 $()을 사용하면 함수가 수정됩니다.

+0

굉장한 답변입니다. 고맙습니다. – user3207575

2

test 또는 [ ]은 종료 상태 인 함수가 아닌 표현식을 계산합니다.

기능/ 명령의 종료 상태를 평가하고 당신이 그것을 사용하는 방법에 if를 사용하려면 테스트 할 경우

if foo "$param1" "$param2"; then .....