2011-10-04 45 views
0

請解釋一下如何正確使用unix shell函數。Unix shell函數,命令替換並退出

例如,我們有以下函數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的文本分配給變量結果。

但如果有以下功能:

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(也許是bash)可以在函數內部定義變量。

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")