Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/07/2019, à 15:37

DonutMan75

[RESOLU] [BASH] quitter si le répertoire existe

Bonjour à tous,
j'ai laissé mon livre sur le bash au boulot... et du coup je bloque sur cette syntaxe "simple".
Si le répertoire $dout n'existe pas, je le crée et je continue l'exécution du script
Dans le cas contraire, j'affiche un message d'erreur et je quitte (code retour 1)

C'est précisément ce deuxième cas qui ne fonctionne pas...
Ca doit vraiment être tout bête mais je sèche....
Une idée ?? Merci d 'avance smile

[ ! -e "$dout" ] && mkdir "$dout" || ( echo "Output directory already exists !" ; exit 1 )
echo "on continue"
$ ./process_pictures.sh 
Output directory already exists !
on continue
$ echo $?
0

Donut

Dernière modification par DonutMan75 (Le 22/07/2019, à 16:19)

Hors ligne

#2 Le 22/07/2019, à 16:08

MicP

Re : [RESOLU] [BASH] quitter si le répertoire existe

Bonjour

En reformulant, ça donne :

Si le répertoire existe, j'affiche le message et j'arrête de suite l'exécution du script en sortant le code d'erreur 1 sur stderr
Sinon, j'exécute la suite du script :
je créé le répertoire
j'affiche le message "On continue"

[ -d  "$dout" ] && { echo "Output directory already exists !"; exit 1; }
mkdir "$dout"
echo "On continue"
Un extrait de la page man du bash a écrit :
…
       -d fichier
              Vrai si le fichier existe et est un répertoire.
       -e fichier
              Vrai si le fichier existe.
…

Dernière modification par MicP (Le 22/07/2019, à 17:29)

Hors ligne

#3 Le 22/07/2019, à 16:11

choops

Re : [RESOLU] [BASH] quitter si le répertoire existe

Salut

Les associations de conditions avec des parenthèse, ça ne marche pas toujours.
Pour avoir le résultat attendu, il vaut mieux le faire avec des accolades et un point-virgule (attention à l'espace entre le ; et l'accollade de fermeture, sans lui ça ne marche pas): { <condition1> <operateur_logique1> <condition2> ; }

Du coup, avec ça, c'est bon:

[ ! -d "$dout" ] && mkdir "$dout" || { echo "Output directory already exists !" && exit 1 ; }
echo "on continue"

EDIT: MicP a été un poil plus rapide et pertinent en réorganisant les conditions. Pas besoin de faire passer la création de dossier parmi les conditions.

Dernière modification par choops (Le 22/07/2019, à 16:13)

Hors ligne

#4 Le 22/07/2019, à 16:18

DonutMan75

Re : [RESOLU] [BASH] quitter si le répertoire existe

Hello, merci pour vos retours rapides et pertinents !!
je crois comprendre que dans mon code initial :

( echo "Output directory already exists !" ; exit 1 )

Le "exit 1" s'applique à l'ensemble de la parenthèse qui retourne la valeur 1... et non pas au programme complet !!
Quoiqu'il en soit, votre factorisation est de toute façon plus propre.
Merci encore et bonne fin d'aprem !

D.

Hors ligne

#5 Le 22/07/2019, à 17:27

MicP

Re : [RESOLU] [BASH] quitter si le répertoire existe

…Le "exit 1" s'applique à l'ensemble de la parenthèse qui retourne la valeur 1... et non pas au programme complet !! …

Oui, ce qui est entre parenthèses est exécuté dans un sous-shell

Le "exit 1" ne concerne que le shell dans lequel il est exécuté <=> le sous-shell

=======
Alors qu'un bloc de commandes entre accolades ne lance pas un sous-shell.
{ commande1; commande2; commande3; ... }

Dernière modification par MicP (Le 22/07/2019, à 17:28)

Hors ligne