2011-10-04 7 views
0

유닉스 셸 함수를 올바르게 사용하는 방법에 대해 설명해주십시오.유닉스 셸 함수, 명령 대체 및 종료

것은 예를 들어 우리는 함수 F와 G 다음 한 :

f() 
{ 
    #do something 
    return $code 
} 

g() 
{ 
    print $something 
} 

우리는 다음 방법으로 함수 f를 사용할 수 있습니다

f 
if [[ $? -eq 0 ]]; then 
    #do 1 
else 
    #do 2 
fi 

이 기능은 일부 종료 상태로 몇 가지 작업을 수행하고 종료.
그리고이 종료 상태를 분석 할 수 있습니다.

우리는 다음 방법으로 함수 g를 사용할 수 있습니다

g 

또는 우리가 기능이라고 첫 번째 경우

result=$(g) 
if [[ $result = "something" ]]; then 
    #do something 
fi 

.
두 번째 경우에는 함수 출력이 stdout에있는 모든 텍스트를 변수 result에 할당하기 위해 명령 대체를 사용했습니다. 기능이 따르고있다

그러나 만약

:

z() 
{ 
    user=$1 
    type=$2 
    if [[ $type = "customer" ]]; then 
     result=$(/somedir/someapp -u $user) 
     if [[ $result = "" ]]; then 
     #something goes wrong 
     #I do not want to continue 
     #I want to stop whole script 
     exit 1 
     else 
     print $result 
     fi 
    else 
     print "worker" 
    fi 
} 

나는 다음 방법으로 함수 Z를 사용할 수 있습니다 뭔가 잘못 다음 전체 스크립트가 중지됩니다 간다

z 

합니다.
그러나 누군가가 명령 치환에서이 기능을 사용하는 경우 :이 경우

result=$(z) 

을 someapp가 빈 문자열 스크립트를 반환하는 경우은 중지되지 않습니다.
함수에서 exit를 사용하는 것이 올바른 방법이 아닌가요?

+1

뭔가를 할 수 있습니다. – Anders

답변

1

지금이 방법을 테스트 할 방법이 없지만 ksh (어쩌면 배시도 가능)는 함수 안에 범위 변수를 넣을 수 있습니다.

z() 
{ 
    typeset result 
    user=$1 
    type=$2 
    if [[ $type = "customer" ]]; then 
     result=$(/somedir/someapp -u $user) 
     if [[ $result = "" ]]; then 
     #something goes wrong 
     #I do not want to continue 
     #I want to stop whole script 
     exit 1 
     else 
     print $result 
     fi 
    else 
     print "worker" 
    fi 
} 

상단 부근에 typeset result이 삽입되어 있습니다.

당신은이 기능을 사용하려면 함수의 대체 declartion을 사용해야 할 수도

, 즉

function z { 
    #.... 
    } 

도움이 되었기를 바랍니다.

또한, 함수를 종료 반환 값을 사용하여 값을 확인하지 마십시오

result=$(z ; "eval retCode=\$? ; echo \$retCode")