Rechercher : dans
Par :

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

Dernière réponse le 8 oct 2009 à 15:31:59 Pitu, le 20 mai 2003 à 15:46:20 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [shell unix] if ... then ... else ... fi » dans :
[Shell] Transferer des fichiers via ssh VoirSSH - Secure SHell Utilisation Informations complémentaires LOGICIELS Sous Linux/Unix Sous Windows Avertissement Utilisation SSH permet d'utiliser des pipelines de commandes, et d'utiliser des tubes d'entrées/sorties comme toute...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Télécharger CygWin VoirCygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de fournir une couche d'émulation Unix pour le système Windows d'un ensemble de librairies, sources et exécutables adaptés à Cygwin...
VBScript - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (VBScript associe le mot clé true à...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...

1

fatabien, le 20 mai 2003 à 15:51:38

Je pense que tu peux tester la syntaxe suivante :
if (!(test -d $nomrep))
C'est la plus courante.

fatabien
www.rock-insight.fr.st

Répondre à fatabien

3

Pitu, le 20 mai 2003 à 15:57:43

Merci mais ...
if (!(test -d $nomrep))
=> !(test: not found

Si t'as une autre syntaxe à me soumettre ...
 
   (:•Þ  Pitu

Répondre à Pitu

2

yro, le 20 mai 2003 à 15:51:40
  • +2

Pourquoi pas faire un bête echo avec rien pour ton instruction qui fasse rien?
----===Yro===----

Répondre à yro

4

Pitu, le 20 mai 2003 à 15:59:54

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

Répondre à Pitu

5

Pitu, le 20 mai 2003 à 16:11:14

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

Répondre à Pitu

6

jisisv, le 20 mai 2003 à 16:33:13

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.

Répondre à jisisv

7

Pitu, le 20 mai 2003 à 16:49:05

Voila ce que je cherchais ...
Merci Jisisv !

 
   (:•Þ  Pitu

Répondre à Pitu

8

fat_cartman, le 21 mai 2003 à 11:50:14

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

Répondre à fat_cartman

9

julien, le 16 jan 2007 à 11:24:53

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.

Répondre à julien

14

doomwatcher, le 13 déc 2007 à 13:49:51

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... ;-)

Répondre à doomwatcher

10

adonis, le 13 sep 2007 à 08:40:51

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.

Répondre à adonis

11

jipicy, le 13 sep 2007 à 09:11:58

Salut,

Essaie plutôt comme ça :

if [ "$(date +%M)" = 30 ]; then ... ; fi
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

12

dubcek, le 13 sep 2007 à 10:44:12

Hello
ou avec la commande at dans un script:

scp ....
at now+30m -f nom_du_script

Répondre à dubcek

17

Myster_fr, le 3 oct 2008 à 14:23:23

Quelqu'un ici a déjà entenu parler de cron ? :-)

=> crontab -e
et tu ajoutes une ligne :
30 * * * * /chemin/complet/vers/ton/script

Répondre à Myster_fr

18

Myster_fr, le 3 oct 2008 à 14:25:05

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 :-)

Répondre à Myster_fr

13

adonis, le 13 sep 2007 à 12:37:35
  • +1

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

Répondre à adonis

19

justedepassage, le 6 nov 2008 à 16:31:17
  • +5

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

Répondre à justedepassage

15

Matthour, le 3 avr 2008 à 15:35:17

Une instruction qui ne fait rien : continue

Répondre à Matthour

16

wako, le 25 sep 2008 à 23:59:20

Continue veut dire qqch chose si tu es dans un boucle tu passes au prochain tour de boucle donc a eviter

Répondre à wako

20

myriam, le 23 déc 2008 à 12:16:43

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"

Répondre à myriam

21

bibiman23, le 8 oct 2009 à 14:02:22

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

Répondre à bibiman23

22

lami20j, le 8 oct 2009 à 14:05:47

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

Répondre à lami20j

23

dubcek, le 8 oct 2009 à 14:11:20

Hello
nom_rep n'est pas défini

tester l'existence de < rien >

Répondre à dubcek

24

lami20j, le 8 oct 2009 à 14:15:23

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

Répondre à lami20j

25

dubcek, le 8 oct 2009 à 14:17:51

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

Répondre à dubcek

26

lami20j, le 8 oct 2009 à 14:23:11

Re,

Tu as raison. 106485010510997108

Répondre à lami20j

27

bibiman23, le 8 oct 2009 à 14:45:23

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

Répondre à bibiman23

28

bibiman23, le 8 oct 2009 à 14:47:38

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.

Répondre à bibiman23

29

lami20j, le 8 oct 2009 à 14:55:50

Re,

Il ne faut pas mettre en commentaire #fi
Il faut supprimer le #
fi 106485010510997108

Répondre à lami20j

30

jipicy, le 8 oct 2009 à 15:03:23

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 ;-((
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

31

bibiman23, le 8 oct 2009 à 15:18:12

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"

Répondre à bibiman23