Les Allergies
Alimentaires
Posez votre question Signaler

[shell unix] if ... then ... else ... fi

Pitu 1398Messages postés 3 octobre 2002Date d'inscription 4 avril 2012Dernière intervention - Dernière réponse le 8 oct. 2009 à 15:31
Bonjour à toutes et à tous.

Après plus de 2 heures de recherches, je capitule :
J'ai besoin de faire un tout bête conditionnement, et je n'y arrive pas :
Je souhaite tester l'existence d'un répertoire, et s'il n'existe pas, le créer.
2 solutions :
1/
if test -d $nomrep
then {
---> Là, il me faut une instruction qui ne fasse rien
}
else {
echo 'Creation du repertoire' $nomrep
mkdir -p $nomrep
}
fi

=> Quelle instruction "vide" puis-je utiliser ?

2/ Tout simplement tester la non-existence du répertoire. Mais je n'y arrive pas non plus :
if !(test -d $nomrep) ... non
if test !(-d $nmrep) ... non plus
if test (!(-d $nomrep)) ... toujours pas
=> Comment formuler mon test ?

Merci d'avance.
Snifff ... j'ai honte de ne pas avoir trouvé tout seul ...

 
   (:•Þ  Pitu
Lire la suite 

[shell unix] if ... then ... else ... fi »

32 réponses
Réponse
+3
moins plus
Pourquoi pas faire un bête echo avec rien pour ton instruction qui fasse rien?
----===Yro===----
Pitu- 20 mai 2003 à 15:59
Merci du conseil, Yro, mais ce script va traiter de gros volumes, et plusieurs dizaines de milliers de fichiers. Tu comprendras donc que je souhaite éviter au maximum l'utilisation de la commande echo
Mais n'y en a-t-il pas une autre qui ne fasse strictement rien ?

 
   (:•Þ  Pitu
Pitu- 20 mai 2003 à 16:11
Bon, j'ai ENFIN réussi à trouver la syntaxe de ce test.
Pour info, c'est tout simplement
if test ! -d $nomrep
Sans parenthèse aucune ...

Maintenant, je serai tout de même curieux de savoir s'il existe une commande peu couteuse et qui ne fasse rien.

Merci aux bonnes volontés qui se sont penchées sur mon problème.

a+
 
   (:•Þ  Pitu
Ajouter un commentaire
Réponse
+3
moins plus
Hello,
sous BASH, true ou false semble faire l'affaire...
if test -d hornua/; then
true
else
echo SOMETHING
fi
echo $?

Johan

The software said "Requires Windows98, Win2000, or better,
So I installed Unix.
Pitu- 20 mai 2003 à 16:49
Voila ce que je cherchais ...
Merci Jisisv !

 
   (:•Þ  Pitu
Ajouter un commentaire
Réponse
+1
moins plus
Je pense que tu peux tester la syntaxe suivante :
if (!(test -d $nomrep))
C'est la plus courante.

fatabien
www.rock-insight.fr.st
Pitu- 20 mai 2003 à 15:57
Merci mais ...
if (!(test -d $nomrep))
=> !(test: not found

Si t'as une autre syntaxe à me soumettre ...
 
   (:•Þ  Pitu
Ajouter un commentaire
Réponse
+1
moins plus
Hé les gars y'a plus simple!
En shell, l'instruction vide, ou nulle, comme vous voulez, existe: c'est ";". Et pour test, essaie avec cette syntaxe:
if ! [ -d $nomRep ] .....
En effet, les crochets sont l'abbreviation de la cmd test. Mais faut pas oublier de mettre des espaces un peu partout autour, sinon ca marche pas, et on se prend la tete vite fait pour qqchose d'invisible.
Voila!

Fat_Cartman,
Parce que je le vaux bien... 
julien - 16 janv. 2007 à 11:24
cartman c est pas if ! [ -d $nomrep ] , c est
if [ ! -d ${nomrep} ] car le test c est [ donc on peut pas mettre le ! avant.
tous les espaces sont importants.
doomwatcher - 13 déc. 2007 à 13:49
Désolé cartman mais ";" est loin d'être une commande qui ne fait rien!!!

c'est utilisé pour lancer de manière séquentielle une série de commande... ;-)
Ajouter un commentaire
Réponse
+1
moins plus
Salut,

Essaie

if [ -d "$nom_rep" ];then 
   echo "le rep $nom_rep existe" 
   mv $nom_rep $nom_rep$(date +%F-%T) 
else mkdir $nom_rep 
  echo "le répertoire $nom_rep n'existe pas" 
  mkdir $nom_rep 
fi 
echo "Fin" 


Ou en ligne de commande
[ -d /chemin/repertoire ] && mv -v /chemin/repertoire /chemin/repertoire$(date +%F-%T) || mkdir -v /chemin/repertoire
--
106485010510997108
Ajouter un commentaire
Réponse
+1
moins plus
J'ai essayé ceci comme proposé par lami20j et ça a marché.

Merci lami20j

echo "tester l'existance de $1"
if [ -d "$1" ];then
echo "le rep $1 existe"
mv $1 $1$(date +%F-%T)
echo "l'ancien répertoire a été archivé"
else
echo "le répertoire $1 n'existe pas"
fi
mkdir $1
echo "le répertoire $1 a été créé"
echo "Fin"
Ajouter un commentaire
Réponse
+1
moins plus
Msg à jipicy

Je vais ajouter elif [ -f "$1" ]; then echo "$1 est un fichier" pour gérer le cas d'un fichier et sortir. Merci jipicy
Ajouter un commentaire
Réponse
+0
moins plus
salu j'essaye depuis quelques heures de faire un tout ptit script mais j'arrive pas.
je veux lancer une commandes scp tout les 30 minutes.

if date +%M=30 then
scp ; j'ai essayé avec echo
fi

la condition date +%M est toujourd valide.
Merci de m'aider.
jipicy- 13 sept. 2007 à 09:11
Salut,

Essaie plutôt comme ça :
if [ "$(date +%M)" = 30 ]; then ... ; fi
;-))
Ajouter un commentaire
Réponse
+0
moins plus
hello
ou avec la commande at dans un script:

scp ....
at now+30m -f nom_du_script
Myster_fr - 3 oct. 2008 à 14:23
Quelqu'un ici a déjà entenu parler de cron ? :-)

=> crontab -e
et tu ajoutes une ligne :
30 * * * * /chemin/complet/vers/ton/script
Myster_fr - 3 oct. 2008 à 14:25
Pardon... La ligne que j'ai donnée exécute ton script à la demi de toutes les heures.

Pour toutes les 30 minutes :
*/30 * * * * /chemin/complet/vers/ton/script

Dsl :-)
Ajouter un commentaire
Réponse
+0
moins plus
merci
mais j'ai utilisé la commnde sleep dans une boucle while "boucle infini"
qui a dit que les boucles infinis sont tres dangereuses dans la programmation.
l'execution du processus est en arriere plan et je peut terminer son execution a l'aide de la commande kill

merci comme meme
justedepassage - 6 nov. 2008 à 16:31
>merci comme meme
l'expression exacte est : merci quand même

En règle générale, si on programme (raisonne) comme on parle/écrit, c'est pas étonnant que beaucoup de problèmes se cachent dans les logiciels...

>qui a dit que les boucles infinis sont tres dangereuses dans la programmation
Même si ce message date d'il y a un an, pour des lecteurs éventuels, oui, il faut éviter les boucles infinies. D'une part, c'est très gourmand en ressources et d'autre part c'est une solution de dernier recours lorsque le problème a été approfondi auparavant (les solutions de rapidité ne sont pas fiables dans le temps sauf coup de chance).

C'est donc très dangereux car, à part un programme lié au domaine d'horaires, vous pouvez gagner du temps. S'il s'agit d'un petit programme pour vous, faites ce que bon vous semble.
Par contre, votre client (si vous en avez) ou votre chef (si c'est en interne) va râler si cela fait ramer sa configuration... Imaginez que votre programme se doit de traiter des milliers d'enregistrements...

Et je ne parle pas d'antivirus (aspect très peu développé) unixiens ni d'applications tierces... Bref, tout dépend de comment vous savez programmer et du réel besoin du pourquoi de votre programme qui a été créé (quel est son but ?). Ce n'est pas dangereux si vous êtes tout seul dans votre coin, ça l'est si vous devez intégrer un programme (hors ceux du domaine de traitement de temps ou ceux typés "Listeners", comme par exemple des "File MQ") dans un logiciel.

Donc à propos de cette question d'adonis (il manque d'ailleurs le point d'interrogation), ou plutôt cette question réthorique, ne vous limitez pas à ne pas comprendre pourquoi certaines règles (ici, sur les boucles infinies) sont établies mais cherchez plutôt à savoir pourquoi ces postulats existent.
Ajouter un commentaire
Réponse
+0
moins plus
une instruction qui ne fait rien : continue
Ajouter un commentaire
Réponse
+0
moins plus
continue veut dire qqch chose si tu es dans un boucle tu passes au prochain tour de boucle donc a eviter
Ajouter un commentaire
Réponse
+0
moins plus
echo "tester l'existance de $non_rep"
if 'test -d $nom_rep' ou(test -e $nom_rep)
then
echo"le rep $nom_rep existe"
else"le pre $nom_rep n'existe pas"
fi
echo"Fin"
bibiman23 - 8 oct. 2009 à 14:02
Bonjour,

J'ai essayé vos solutions, mais ça n'a pas marché.
Alors je désire Créer un répertoire, s'il existe renommer l'existant en le concaténant avec la date et heure systeme

echo "tester l'existance de $nom_rep"
#if 'test -d $nom_rep'
if test ! -d $nom_rep
then
echo "le rep $nom_rep existe"
mv $nom_rep $nom_rep$(date +%F-%T)
else mkdir $nom_rep
#"le répertoire $nom_rep n'existe pas"
fi
echo "Fin"

je le lance comme ceci sh mkdir.sh test et j'ai la réponse suivante:

# sh mkdir.sh test
tester l'existance de
mkdir.sh[7]: test: 0403-004 Specify a parameter with this command.
Usage: mkdir [-p] [-m mode] Directory ...
Fin
Ajouter un commentaire
Réponse
+0
moins plus
hello
nom_rep n'est pas défini

tester l'existence de < rien >
Ajouter un commentaire
Réponse
+0
moins plus
Re,

nom_rep n'est pas défini

En ce cas (j'ai pensais qu'il n'a pas collé tout le script)

nom_rep='/chemin/repertoire'
echo "tester l'existance de $nom_rep" 
if [ -d "$nom_rep" ];then 
   echo "le rep $nom_rep existe" 
   mv $nom_rep $nom_rep$(date +%F-%T) 
else mkdir $nom_rep 
  echo "le répertoire $nom_rep n'existe pas" 
  mkdir $nom_rep 
fi 
echo "Fin" 
--
106485010510997108
Ajouter un commentaire
Réponse
+0
moins plus
possible mais d'après l'exécution
# sh mkdir.sh test
tester l'existance de
mkdir.sh[7]: test: 0403-004 Specify a parameter with this command.
Usage: mkdir [-p] [-m mode] Directory ...
Fin
lami20j- 8 oct. 2009 à 14:23
Re,

Tu as raison.
Ajouter un commentaire
Réponse
+0
moins plus
J'ai vu qu'il n'arrivait pas à recupérer le nom de la variable j'ai fais quelques modif que voici:

# cat mkdir.sh
echo "tester l'existance de $1"
if [ ! -e "$1" ]; then
mkdir $1
elif [ -f "$1" ]; then
echo "$1 est un fichier"
elif mv $1 $1$(date +%F-%T)
#fi
echo "Fin"
ppmdadm@dmut2:/applis/ppmd/bin/PPM75/transfers
# sh mkdir.sh test
tester l'existance de test
mkdir.sh[2]: 0403-057 Syntax error at line 6 : `if' is not matched.

là c'est un problème avec le if
Ajouter un commentaire
Réponse
+0
moins plus
et quand je remet le fi il m'affiche :

tester l'existance de test
mkdir.sh[2]: 0403-057 Syntax error at line 7 : `fi' is not expected.
Ajouter un commentaire
Réponse
+0
moins plus
Re,

Il ne faut pas mettre en commentaire #fi
Il faut supprimer le #
fi
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Y'a une erreur de syntaxe :
# cat mkdir.sh
echo "tester l'existance de $1"
if [ ! -e "$1" ]; then
mkdir $1
elif [ -f "$1" ]; then
echo "$1 est un fichier"
else mv $1 $1$(date +%F-%T)
fi
echo "Fin" 

Mais même sans celà ce n'est pas bon, dans la mesure où tu essaies de créer ton répertoire avant d'avoir testé si le paramètre est bien un répertoire et non un fichier ;-((
Ajouter un commentaire
Ce document intitulé « [shell unix] if ... then ... else ... fi » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?