Test sur boolean et autre condtion

Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - Modifié par Swiss Knight le 26/01/2014 à 18:09
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 28 janv. 2014 à 09:02
Bonjour,

Je ne comprends pas pourquoi ce test me retourne toujours "absolu" :
(note : remplacer Desktop par un nom de dossier adéquat si nécessaire)
#!/bin/bash
chemin="Desktop"
    case "${chemin}" in
        /*)
        absolute=1
        ;;
        *)
        absolute=0
        ;;
    esac

if [[ -d "${chemin}" && ${absolute} ]]; 
then
    echo "Le chemin est absolu.";
elif [[ -d "${chemin}" && ! ${absolute} ]];
then
    echo "Le chemin est relatif.";
else
    echo "${chemin} n'est pas un chemin valable !";
fi


Explications : je dois tester si un paramètre passé en argument à un script bash est un chemin :
1) existant, ce serait pas mal...
2) et s'il existe, je dois tester s'il est absolu ou relatif.

En gros, je bûche sur mon test if ; je n'arrive pas à tester à la fois si $chemin est un dossier, et tester un boolean. Je m'y prends sans doute mal dans ce deuxième cas.


Merci ! ;)
A voir également:

3 réponses

Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
26 janv. 2014 à 18:30
Ne me demandez pas pourquoi mais à force d'essais, j'ai trouvé ceci qui a l'air de fonctionner :

#!/bin/bash
chemin="Desktop"
    case "${chemin}" in
        /*)
        absolute=true
        ;;
        *)
        absolute=false
        ;;
    esac

if ${absolute} && [ -d "${chemin}" ]; 
then
    echo "Le chemin est absolu.";
elif ! ${absolute} && [ -d "${chemin}" ];
then
    echo "Le chemin est relatif.";
else
    echo "${chemin} n'est pas un chemin valable !";
fi


Apparemment les 1 et 0 ça marche pas, il faut écrire "true" et "false" en toutes lettres. Chose que je trouve un peu absurde, mais bon, c'est comme ça. Je pense que c'est dû au fait que true et false sont des commandes.

Ah, et puis au passage, pour éviter de faire tourner le 'case' sur un chemin qui n'existe pas, j'ai ficelé ça comme ça ;

#!/bin/bash
chemin="Desktop"
    if [ -d "${chemin}" ];
    then
        case "${chemin}" in
        /*)
        absolute=true
        ;;
        *)
        absolute=false
        ;;
        esac
        if ${absolute};
        then
            echo "Le chemin ${chemin} est absolu."
        elif ! ${absolute};
        then
            echo "Le chemin ${chemin} est relatif."
        fi
    else
        echo "No such directory : ${chemin}."
        exit 0
    fi


Bonne soirée ! :)
0
Utilisateur anonyme
26 janv. 2014 à 21:13
salut,

case
n'est pas indispensable:
if [[ -d "$chemin" && $chemin == /* ]]
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
28 janv. 2014 à 09:02
hello
dans ce test
if [[ -d "${chemin}" && ${absolute} ]]; 
$absolute est traité comme une chaine de caractère et pas comme 1 ou zéro numérique, donc si la chaine n'est pas vide le test sera vrai
$ chemin=~/Desktop; absolute=1
$ [[ -d "${chemin}" && ${absolute} ]] && echo vrai
vrai
$ chemin=~/Desktop; absolute=0
$ [[ -d "${chemin}" && ${absolute} ]] && echo vrai
vrai
$ chemin=~/Desktop; absolute=""
$ [[ -d "${chemin}" && ${absolute} ]] && echo vrai
$
0