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 :

Petit bash bien ennuyeux !


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut Petit bash bien ennuyeux !
    Bonsoir à toutes et à tous

    Je dois écrire un petit script qui reçoit en paramètre des commandes et des flags. On prend l'hypothèse ou le premier paramètre est une commande et que l'on ne trouve jamais deux flags qui se suivent.

    Ex : sh exercice1.sh ls -l pwd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    #Exercice1
     
     
    while [ $# -ne 0 ]
    do
    case $# in
    "$2"=-*) $1$2 
    	 shift 2;;
    *) $1 
       shift;;
    esac
    done
    Malheureusement ça ne marche pas. Je sais que l'erreur vient d'ici

    J'aimerais trouver un moyen de dire au bash " si le paramètre 2 comporte un tiret comme premier caractère alors tu exécutes la commande et son flag.

    Je croyais que l'étoile pouvait remplacer n'import quelle suite de caractère mais apparemment ce n'est que valable pour les fichiers et répertoires ?

    Si quelqu'un aurait une idée ? Elle est la bienvenue !

    Amicalement crodilus.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    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 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par crodilus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    #Exercice1
     
     
    while [ $# -ne 0 ]
    do
    case $# in
    "$2"=-*) $1$2 
    	 shift 2;;
    *) $1 
       shift;;
    esac
    done
    Malheureusement ça ne marche pas. Je sais que l'erreur vient d'ici

    Salut
    Manifestement tu n'as pas pigé comment fonctionne un case.
    Un case permet de comparer un élément X avec plusieurs possibilités. Par exemple comparer X avec "tata" ou "toto"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case X in
        "tata") ...;;
        "toto") ...;;
    esac

    Toi déjà tu regardes $# (le nombre d'arguments ???) et tu demandes au shell de voir donc si ce nombre vaut "$2"=-*. Il est bien incapable de piger ce que tu veux lui faire faire (déjà que moi j'ai du mal...)

    Citation Envoyé par crodilus Voir le message
    J'aimerais trouver un moyen de dire au bash " si le paramètre 2 comporte un tiret comme premier caractère alors tu exécutes la commande et son flag.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    test $(echo $2 |cut -c1) = "-" && $1 $2

    Citation Envoyé par crodilus Voir le message
    Je croyais que l'étoile pouvait remplacer n'import quelle suite de caractère mais apparemment ce n'est que valable pour les fichiers et répertoires ?
    Ca dépend du contexte. Effectivement si ton shell est en train de manipuler des fichiers et qu'il tombe sur une étoile, il regardera alors tous les fichiers du répertoire correspondant et vérifiera si leur nom matche la chaine. En revanche, dans un case, il regardera simplement l'élément X matche la chaine

    Citation Envoyé par crodilus Voir le message
    Si quelqu'un aurait une idée ? Elle est la bienvenue !
    Bah je suis le premier mais tous les autres habitués de cette section auront aussi des idées sûrement toutes plus brillantes les unes des autres (surtout N_Bah qui m'épate chaque fois qu'il pond une ligne mais c'est probablement parce qu'il développe à fond les possibilités bash alors que moi je suis obligé de rester dans du shell compatible sh)...
    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]

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Effectivement je n'avais pas compris grand chose au fonctionnement du case !

    Mais grâce à ton intervention j'ai trouvé une solution qui fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #!/bin/bash
    #Exercice1
     
     
    while [ $# -ne 0 ]
    do
    var=`echo $2 |cut -c1`
    case $var in
      "-") $1 $2 
         shift 2;;
      *) $1 
         shift;;
    esac
    done

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 516
    Par défaut
    Hello !

    Ça fonctionne et ça a l'avantage d'être valable sur tous les Unices. Cependant, « cut » est une commande externe.

    La man page nous apprend en revanche que bash propose l'opérateur « =~ » utilisable avec « [[ ]] ». Donc :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
        [[ $i =~ -.* ]] && echo "La variable i débute par un tiret."

    Apparemment, en utilisant les doubles crochets, il est inutile de protéger l'expression avec des guillemets et/ou de lui adjoindre un préfixe pour gérer le cas de la chaîne vide.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Hello !

    Ça fonctionne et ça a l'avantage d'être valable sur tous les Unices. Cependant, « cut » est une commande externe.

    La man page nous apprend en revanche que bash propose l'opérateur « =~ » utilisable avec « [[ ]] ». Donc :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
        [[ $i =~ -.* ]] && echo "La variable i débute par un tiret."

    Apparemment, en utilisant les doubles crochets, il est inutile de protéger l'expression avec des guillemets et/ou de lui adjoindre un préfixe pour gérer le cas de la chaîne vide.
    Si c'est plus portable pourquoi pas ? !

    Citation Envoyé par jabbounet Voir le message
    Pourquoi ne pas utiliser getops?

    Quelques liens sur le sujet.

    http://www.shellunix.com/ksh.html#Getopts


    http://www.developpez.net/forums/d32.../bash-getopts/
    A vrai dire je ne fais que du linux depuis trois mois donc je ne connais pas encore grand chose.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 686
    Par défaut
    Bonjour,

    Citation Envoyé par Obsidian
    La man page nous apprend en revanche que bash propose l'opérateur « =~ » utilisable avec « [[ ]] ». Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ $i =~ -.* ]] && echo "La variable i débute par un tiret."
    une regex n'est pas indispensable, un simple glob fait le boulot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ $i == -* ]] && echo "La variable i débute par un tiret."

    Crodilus:
    n'exécute pas un script bash en l'appelant avec sh, car alors, c'est sh (qui peut être un alias vers bash, ou pas!!!) qui exécutera les commandes du script.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 76
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    n'exécute pas un script bash en l'appelant avec sh, car alors, c'est sh (qui peut être un alias vers bash, ou pas!!!) qui exécutera les commandes du script.
    Que me conseilles-tu alors ? !

  8. #8
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Pourquoi ne pas utiliser getops?

    Quelques liens sur le sujet.

    http://www.shellunix.com/ksh.html#Getopts


    http://www.developpez.net/forums/d32.../bash-getopts/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/09/2009, 08h39
  2. Petite SSII Bien négocié ou pas
    Par supernano dans le forum SSII
    Réponses: 6
    Dernier message: 27/02/2009, 16h51
  3. Réponses: 9
    Dernier message: 07/05/2006, 16h39
  4. Est ce quelqu'un veut bien me rendre un petit service?
    Par Vincere dans le forum Windows
    Réponses: 16
    Dernier message: 01/02/2006, 01h21
  5. Petit scrtip bash qui ne marche pas..
    Par Fritzoune dans le forum Linux
    Réponses: 4
    Dernier message: 15/06/2005, 16h35

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