2010-01-17 7 views
0

J'ai du mal à comprendre comment faire cette instruction if. Je veux faire:Comment faire cette instruction if dans le shell

IF (la fonction a seulement 1 argument ET 1 $ est un répertoire (dans le dossier en cours)) OU SI (la fonction a 2 arguments et 1 $ est pas un répertoire) ALORS

.... 

FIN

Désolé si ce n'est pas très clair,

Remerciez s à l'avance

Répondre

0

Vous à peu près dit ce qui est nécessaire dans la question:

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

Vous pouvez utiliser d'autres opérateurs aussi - qui fonctionnera dans le shell Bourne, et encore moins Korn ou d'autres coquilles POSIX (en supposant que $ # fonctionne correctement dans une fonction - ce qu'il fait dans 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

Notez que vous pouvez utiliser l'opérateur '-o' dans le test ('[') intégré; le conseil de longue date (mais pas nécessairement toujours pertinent) est de ne pas essayer de jouer avec '-a' et '-o' (ou même avec '-a' ou '-o'). Faire les choses comme montré est fiable et évite le besoin d'échapper à des parenthèses, etc. –

+0

Merci, ça fonctionne comme un charme! – 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

Je crois que l'OP veut "ou" plutôt que "elif". –

+0

Il est susceptible de vouloir faire quelque chose (légèrement) différent dans chaque cas, ce qui montre dans l'exemple. –