2010-01-17 6 views
0

Мне сложно определить, как это сделать, если инструкция. Я хочу, чтобы это сделать:Как сделать это утверждение if в оболочке

IF (функция имеет только один аргумент и $ 1 является каталогом (в текущей папке)) ИЛИ ЕСЛИ (функция имеет 2 аргументы и $ 1 не является каталогом) ТОГДА

.... 

END

Извините, если это не очень понятно,

Спасибо s заранее

ответ

0

Вы довольно много сказал, что нужно в этом вопросе:

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

Вы можете использовать другие операторы тоже - что будет работать в Bourne оболочке, не говоря уже о Korn или другой 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»). Делать вещи, как показано, является надежным и избегает необходимости избегать скобок (скобки) и т. Д. –

+0

Спасибо, это работает как шарм! – Selmak

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». –

+0

Скорее всего, в каждом случае нужно что-то делать (скользкое), что показано в примере. – 2010-01-17 15:55:22

Смежные вопросы