IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Bash] Création de condition (if,else, then, while)


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Avatar de dexter74
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Billets dans le blog
    3
    Par défaut [Bash] Création de condition (if,else, then, while)
    Bonjour,

    Je souhaiterai un petit coups de main pour mon script pour le conditionnée.

    J'aimerai que si ma commande est égale (Point de montage existant) à Zéro sa me répond OK.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if [ "ls /mnt" = "0" ]
     then
      echo "OK"
     else
      echo "KO"
    fi
    Code Retour actuel: KO
    Code Retour voulu : OK
    Le point de montage /mnt existe

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 173
    Par défaut
    Le script tel quel ne pourra pas marcher car dans tout système Linux tu auras un dossier /mnt dans le /, qu'il y ai un montage ou non dedans.

    Tu peux soit vérifier la présence d'un fichier présent uniquement dans le point de montage,, soit vérifier que celui-ci est monté avec mount par exemple.

    Et évites d'utiliser ls dans un script (sinon tu vas te faire engueuler par NBaH )
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 556
    Par défaut
    Quand tu utilises if [ "ls /mnt" = "0" ], tu compares de l'alpha-numérique, des chaînes de caractère, avec du numérique 0 (zéro), ce qui, informatiquement parlant, est incorrect et ne peut de plus être compatible avec bash pour lequel les données ne sont pas - comme on dit - fortement typées.

    C'est à toi de tout concevoir en amont de ce point de vue.

    Bash utilise le mécanisme de typage dynamique : il n'est donc pas nécessaire de spécifier un type pour une nouvelle variable.

    Un nom de variable peut contenir des chiffres, des lettres et des symboles souligné mais ne doit pas commencer par un chiffre. La plupart du temps, les variables du shell bash sont des chaînes de caractères.
    Source : Programmation Bash/Notions essentielles du shell bash — Wikilivres


    Par ailleurs, comme l'écrit chrtophe, il y a toujours un répertoire /mnt, tu peux essayer de compter et comparer avec, par exemple, ls /mnt | wc -l (wc pour word count) :

    wc - Afficher le nombre de lignes, de mots et d'octets d'un fichier
    -l, --lines
    afficher le nombre de lignes
    Voir man wc

    ps
    Avec les restrictions d'usage de la commande ls :

    II-B. Exemples d'erreurs courantes

    III-A. Éviter la commande « ls » dans les scripts

    Quelques bonnes pratiques dans l'écriture de scripts Bash [Tutoriel]
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Citation Envoyé par Escapetiger Voir le message
    Quand tu utilises if [ "ls /mnt" = "0" ], tu compares de l'alpha-numérique, des chaînes de caractère, avec du numérique 0 (zéro), ce qui, informatiquement parlant, est incorrect et ne peux de plus être compatible avec bash pour lequel les données ne sont pas - comme on dit - fortement typées.:
    en fait, par défaut, pour bash, tout est du texte, a fortiori quand il est entre guillemets.
    de plus, le signe égal est un opérateur de comparaison lexicale : il ne compare que du texte, et "0" aussi est du texte.

    ps
    Avec les restrictions d'usage de la commande ls :
    tout à fait,
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!!

    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 556
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    en fait, par défaut, pour bash, tout est du texte, a fortiori quand il est entre guillemets.
    de plus, le signe égal est un opérateur de comparaison lexicale : il ne compare que du texte, et "0" aussi est du texte.
    Merci pour ce rappel, j'aurais du effectivement préciser dans le cas présent comme ci-dessous :

    «
    Fonctions numériques
    • Entier1 -eq Entier2 -- Entier1 et Entier2 sont, algébriquement parlant, égaux.
    • Entier1 -ne Entier2 -- Entier1 n'est pas égal à Entier2.
    • Entier1 -gt Entier2 -- Entier1 est strictement supérieur à Entier2.
    • Entier1 -ge Entier2 -- Entier1 est supérieur ou égal à Entier2.
    • Entier1 -lt Entier2 -- Entier1 est strictement inférieur à Entier2.
    • Entier1 -le Entier2 -- Entier1 est inférieur ou égal à Entier2.

    »
    Source : test (Unix) - Wikipedia
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dexter74 Voir le message
    J'aimerai que si ma commande est égale (Point de montage existant) à Zéro sa me répond OK.
    Comme il a été dit, ton script ne compare que des strings (qui visiblement ne sont pas égales).

    Toutefois le shell possède un avantage assez conséquent: il peut tester directement une commande, sous-entendu alors que la commande renvoie un statut 0 (ok) ou pas 0 (échec).
    Autrement dit, un script qui pourrait s'écrire ainsi
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    commande; statut=$?
    if test $statut -eq 0; then			# if [ $statut -eq 0 ]; then
    	echo "ok"
    else
    	echo "KO"
    fi
    pourra alors s'écrire ainsi
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if commande; then
    	echo "ok"
    else
    	echo "KO"
    fi
    Ca marche pour pratiquement toutes les commandes Unix existantes (pour l'instant la seule que j'ai trouvée ne pouvant pas être utilisée de cette façon est expr qui renvoie le statut 1 quand elle affiche 0).

    Ici, ça donnera(it)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ls /mnt 1>/dev/null 2>&1; then
    	echo "ok"
    else
    	echo "KO"
    fi
    Ca c'est le principe de base permettant de tester une commande (la redirection vers /dev/null permettant de ne pas polluer l'écran de messages en provenance du "ls" qui d'une part affiche ce qu'il trouve et d'autre part gueule s'il ne trouve pas)

    Accessoirement (avant que N_BaH ne vienne me tronçonner), on n'utilise pas "ls" dans un script car il y a toujours moyen de faire autrement. Ainsi cet exemple peut se réécrire ainsi
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if test -e /mnt; then			# if [ -e /mnt ]; then
    	echo "ok"
    else
    	echo "KO"
    fi

    Et enfin il y a la logique de ton idée. Tu veux tester si un point de montage existe mais un point de montage existe toujours. Peut-être veux-tu plutôt savoir s'il est monté ou pas et dans ce cas le résultat à récupérer dans la commande mount |grep /mnt.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if mount |fgrep /mnt 1>/dev/null; then
    	echo "ok"
    else
    	echo "KO"
    fi
    (et pas besoin de rediriger le canal 2 car contrarement à "ls", fgrep ne dit rien quand il ne trouve pas).

    Sinon on peut trouver d'autres possibilités comme par exemple regarder si l'inode de "." dans "/mnt" vaut 2 (ce qui est le cas quand un dossier est monté). Bref...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 335
    Par défaut
    Comme le dit Sve@r, plusieurs méthodes, une simple serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$(stat --printf '%m' /mnt )" = "/mnt" ; then echo ok ; else echo ko ; fi

  8. #8
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 556
    Par défaut
    [Aparté]
    Citation Envoyé par N_BaH Voir le message
    ON N'UTILISE PAS ls DANS UN SCRIPT !!!!

    Citation Envoyé par Sve@r Voir le message
    Accessoirement (avant que N_BaH ne vienne me tronçonner), on n'utilise pas "ls" dans un script car il y a toujours moyen de faire autrement. Ainsi cet exemple peut se réécrire ainsi
    Oui, nous sommes des Grandes Gueules avec un grand coeur et on sait grâce à ce film culte ce qu'est une tronçonneuse et une Schlitte

    Schlitte et Grandes Gueules dans les Vosges - franceinfo:culture

    [/Aparté]
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$(stat --printf '%m' /mnt )" = "/mnt" ; then echo ok ; else echo ko ; fi
    Mince, je ne connaissais pas "%m"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre confirmé
    Avatar de dexter74
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 115
    Billets dans le blog
    3
    Par défaut re
    Bonjour à tous,

    Je vous remercie beaucoup, j'attendais pas autant de solution possible.

Discussions similaires

  1. condition (if/else) qui ne fonctionne pas
    Par oceane751 dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 23h58
  2. [Bash] mettre plusieurs conditions dans un while
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 22/07/2007, 22h44
  3. Condition if/else et région répétée
    Par craac dans le forum Langage
    Réponses: 6
    Dernier message: 10/04/2007, 11h20
  4. Réponses: 23
    Dernier message: 26/10/2006, 16h50
  5. [MySQL] instruction condition if - else
    Par Henry9 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/09/2006, 23h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo