2010-01-17 60 views
0

我很難搞清楚如何做到這一點,如果語句。我想這樣做:如何使這個if語句在shell中

IF(函數只有1個參數 和$ 1是一個目錄(在當前 文件夾)),或者如果(函數有2個 參數和$ 1不是一個目錄) THEN

.... 

END

很抱歉,如果它不是很清楚,

謝謝S IN提前

回答

0

你幾乎說的話,需要在這樣的問題:

if [ $# = 1 -a -d "$1" ] || [ $# = 2 -a ! -d "$1" ] 
then 
    ... 
fi 

您可以使用其他運營商太 - 將在Bourne shell的工作,更不用說光輝或其他POSIX殼(假設$ #在一個函數中工作正常 - 它在Bash中工作)。

fun() 
{ 
    if [ $# = 1 -a -d "$1" ] || [ $# = 2 -a ! -d "$1" ] 
    then echo "Pass ($1, $#)" 
    else echo "Fail ($1, $#)" 
    fi 
} 

fun $HOME 
fun $HOME abc 
fun $HOME/xyz abc 
fun /dev/null 
+0

注意,您可以使用 '-o' 操作測試( '[')內置;長期(但不一定相關)的建議是不要試圖搞亂'-a'和'-o'(或者甚至用'-a'或'-o')。做的事情如圖所示是可靠的,避免了需要擺脫括號(括號)等。 – 2010-01-17 15:41:35

+0

謝謝你,它的作品就像一個魅力! – Selmak 2010-01-17 15:53:54

0
if [[ $# == 1 && -d "$1" ]]; then 
    echo "one param, first is a dir" 
elif [[ $# == 2 && ! -d "$1" ]]; then 
    echo "two params, first is not a dir" 
else 
    echo "unexpected" 
fi 
+0

我相信OP希望「或」而不是「elif」。 – 2010-01-17 15:47:18

+0

這可能要在每種情況下做一些(略微)不同的事情,這在示例中顯示。 – 2010-01-17 15:55:22