2010-06-29 141 views
5

實施例返回一個值。從外殼腳本函數

我可能會寫ls -1 a* >/dev/null 2>/dev/null,但是如果有更復雜的腳本可能會導致錯誤。

有沒有辦法從a()返回單個值?

+0

'r = $(a); echo $ r'當然可以用'a'代替。 – 2012-05-19 12:37:24

回答

4

一個shell函數可以返回一個數值。考慮0和1,而不是「f」和「T」

#!/bin/sh 

a() { 
R=0 
ls -1 a* 
[ "$?" == "1" ] && { R=1; } 
return $R 
} 

a 
r=$? 
echo $r 

這仍然會寫從中你可能仍然要處理的ls -1 a*輸出,但r值將是0或1億韓元不包括輸出。

重定向輸出的其他例子可以是一行或一整塊,如其他人所建議的,您應該瞭解其他方式來測試條件(但我假設ls是一種任意例如)

+0

爲什麼不用'$ R'跳過整個時髦的業務,然後運行'ls'然後'返回$?'? – Caleb 2013-07-31 08:44:18

+0

@Caleb - 這個答案是對PeterMmm原始腳本的修改,以演示shell函數如何返回值。我相信整個樣本函數可以被忽略,但我不知道他在真實代碼中可能會做什麼。 – 2013-07-31 23:54:46

0
a() { 
ls -1 a* > /dev/null 
[ "$?" == "0" ] && echo t || echo f 

} 

r=`a` 
echo $r 

考慮使用[-f文件名]和其他文件測試。

1

您不必使用ls來檢查從a開始的文件。只需使用shell

a() { 
    shopt -s nullglob 
    ret="f" 
    for file in a* 
    do 
    ret="t" 
    break 
    done 
    echo "$ret" 
} 
+0

這是一個例子,不是我的問題。如何避免寫入無處不在「>/dev/null 2>/dev/null」當我想從腳本函數中獲取單個值/字符串時。 – PeterMmm 2010-06-29 12:01:53

1

你可以把一個重定向命令的列表:

 
{ 
    command1 
    command2 
} >/dev/null 

如果在腳本中的某些時候,你不想從後續命令的任何輸出,你可以重定向外殼的與exec內置輸出:

 
echo interesting 
exec >/dev/null 
echo boring 

注意,這一直持續到腳本的末尾,而不是直到函數結束。這會在有趣的之後處理命令,但不在之前。

有一種方法可以通過使用文件描述符操作來恢復exec /dev/null的效果。我不一定會推薦它,因爲在實踐中制定出來可能會很棘手。我們的想法是將連接到標準輸出的任何東西重新定位到不同的描述符,然後將標準輸出重定向到不同的文件,最後將原始標準輸出重新定位回標準輸出。

 
{ 
    exec 3>&1   # duplicate fd 3 to fd 1 (standard output) 
    exec >/dev/null # connect standard output to /dev/null 
    echo boring 
    exec 1>&3   # connect standard output back to what was saved in fd 3 
    echo interesting 
    exec >/dev/null # connect standard output to /dev/null again 
    echo more boring 
} 3>/dev/null  # The braced list must have its fd 3 connected somewhere, 
        # even though nothing will actually be written to it.