SHELL condition

Résolu
tlep Messages postés 597 Statut Membre -  
tlep Messages postés 597 Statut Membre -
Bonjour,

comment imbriquer des conditions en shell ?
Je m'explique:
if [ "$fichier" != "" -a [ ! -f "$fichier" -o ! -d "$fichier" ]];then echo "Arguments incorrects: monscript FICHIER." && exit 1;fi
J'obtiens invariablement:
bash: [: missing `]

Merci ;-)
Configuration: Linux Debian
Mozilla 1.8.1.3

9 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    $ a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 5 ]; then echo ok;else echo pas ok;fi
    ok
    
    $ a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 3 ]; then echo ok;else echo pas ok;fi
    pas ok
    
    [jp@MDK tmpfs]$ 
    :-))
    3
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    if [ test1 ] && ([ test2 ] || [ test3 ])
    sinon tu peux utiliser la syntaxe
    if condition1
    then
      commande1
    elif condition2
    then
      commande3
    else
       commande4
    fi
    2
  3. tlep Messages postés 597 Statut Membre 118
     
    Salut, et merci;

    Je ne comprends pas du tout ta syntaxe jipicy:

    a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 3 ]; then echo ok;else echo pas ok;fi

    "b" est toujours égal à "b" non ?
    1
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Oups :-((((

    Ereur dans la ligne, il faut lire :
    if [ "$a" = 0 -a "$b" = 5 -o "$b" = 3 ]
    Sorry ;-)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tlep Messages postés 597 Statut Membre 118
     
    J'ai un autre souci avec les OU et les ET :

    En ligne de commande, si j'exécute :
    which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
    Ca marche: j'obtiens
    Vous devez préalablement installer monprog.
    Fin du script

    En revanche dans un shell :

    #!/bin/bash
    which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
    echo "Suite du script"

    Là, les messqges s'affichent mais le script n'exit pas: Suite du script !

    Je ne comprends vraiment pas !!!
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Enlève les parenthèses, elles servent à rien.
    0
  8. tlep Messages postés 597 Statut Membre 118
     
    J'y ai bien pensé, mais dans ce cas (sur la commande ls, installée) :

    which ls 1>/dev/null || echo "Vous devez préalablement installer ls." && echo "Fin du script" && exit 1

    Dans le script, çà donne :
    Fin du script

    Bref, il saute le OU, passe au ET, et exit !!!!
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ben c'est normal.

      La commande qui suit "||" n'est exécutée que SI la commande la précédant a renvoyé un code retour différent de "0" (zéro), autrement dit une erreur.
      Et là ce n'est précisément pas le cas, étant donné que la commande "ls" a été trouvée... donc on passe au ET (&&).

      ;-))
      0
  9. bipod
     
    dans
    cmd1 || ( cmd2 && exit )
    cmd2 et l'exit sont exécutés dans un shell fils (fork) du fait des parenthèses => l'exit ne fait que sortir du processus fils qui de toute façon s'achève avec la parenthèse fermante.

    Sans les ( ) l'enchainement est bien celui décrit par jipicy

    essaye
    cmd1 || {
    cmd2
    cmd3
    exit
    }
    cmd4
    0
    1. tlep Messages postés 597 Statut Membre 118
       
      Merci pour tes explications !!

      Les accolades fonctionnent effectivement mieux en lieu et place des parenthèses.

      En revanche, ce que je ne comprends pas, c'est pourquoi (et surtout quand ??) il faut utiliser des accolades et non des parenthèses ?

      Si je mets :
      which prog 1>/dev/null || { echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; }
      Ca fonctionne.
      Et quand je mets :
      which prog 1>/dev/null || ( echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; )
      on tombe dans un "fork", c.a.d une sorte de "sous-programme" (si j'ai bien compris ?) dont la dernière instruction "exit" ne concerne pas le programme principal ?
      0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Les accolades et les parenthèses permettent le regroupement de commandes.
    Comme expliqué par "bipod", avec des accolades, les commandes sont exécutées par le shell courant, alors qu'avec les parenthèses elles sont exécutées par un shell fils (fork).

    Le regroupement de commandes sert principalement à :
    - rediriger un ensemble de commandes vers (ou depuis) un même fichier
    - exécuter un ensemble de commandes en arrière-plan
    - conditionner l'exécution d'un ensemble de commandes

    Voilà un exemple qui j'espère t'aidera à mieux cerner l'emploi des accolades et des parenthèses :
    #! /bin/bash
    
    echo -e "#############################"
    echo -e "# Utilisation des accolades #"
    echo -e "#############################"
    
    echo -e "\nRépertoire courant : \c"
    pwd
    echo -e "Initialisation de la variable \"v\" :\nv=\"abc\""
    v="abc"
    echo -e "\nDébut de l'environnement avec accolades...\n"
    {
    echo -e "Réaffectation de la variable \"v\" :\nv=\"123\""
    v="123"
    echo -e "\nAffichage de la variable \"v\" : \c"
    echo -e "$v"
    echo -e "\nChangement de répertoire : "
    echo -e "cd /tmp"
    cd /tmp
    echo -e "\nRépertoire courant : \c"
    pwd
    }
    echo -e "\nFin de l'environnement avec accolades...\n"
    
    echo -e "\nRépertoire courant : \c"
    pwd
    echo -e "\nAffichage de la variable \"v\" : \c"
    echo -e "$v"
    echo
    
    unset v
    cd $HOME
    
    echo -e "Appuyez sur une touche pour continuer..."
    read touche
    
    echo -e "###############################"
    echo -e "# Utilisation des parenthèses #"
    echo -e "###############################"
    
    echo -e "\nRépertoire courant : \c"
    pwd
    echo -e "Initialisation de la variable \"v\" :\nv=\"abc\""
    v="abc"
    echo -e "\nDébut de l'environnement avec parenthèses...\n"
    (
    echo -e "Réaffectation de la variable \"v\" :\nv=\"123\""
    v="123"
    echo -e "\nAffichage de la variable \"v\" : \c"
    echo -e "$v"
    echo -e "\nChangement de répertoire : "
    echo -e "cd /tmp"
    cd /tmp
    echo -e "\nRépertoire courant : \c"
    pwd
    )
    echo -e "\nFin de l'environnement avec parenthèses...\n"
    
    echo -e "\nRépertoire courant : \c"
    pwd
    echo -e "\nAffichage de la variable \"v\" : \c"
    echo -e "$v"
    echo
    exit
    
    ;-))
    0
    1. tlep Messages postés 597 Statut Membre 118
       
      Merci, c'est très clair ;-)
      0