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

Linux Discussion :

[KSH] Explication sur l'utilisation des doubles crochet/parenthèse


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 66
    Points : 51
    Points
    51
    Par défaut [KSH] Explication sur l'utilisation des doubles crochet/parenthèse
    Bonjour,

    J'essaie de comprendre pourquoi on utilise des crochets simples ou des doubles crochets pour faire des tests en KSH. Même, en lisant cette page, http://marcg.developpez.com/ksh/, en particulier le paragraphe 8.1. Je n'arrive toujours pas à comprendre.

    Je vais écrire des exemples simples et écrire comme j'ai l'habitude de le faire et vous me direz si j'ai raison ou tort d'écrire comme ça.

    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
    16
    17
    18
    c1=1
    c2=2
    if [ $c1 -eq $c2 ]
    then
      print "yes"
    else
      print "no"
    fi
     
    var1=TOTO
    var2=TOTO
     
    if [[ $var1 != $var2]]
    then
      print "yes"
    else
      print "no"
    fi
    Voilà, juste pour avoir votre avis. Dois-je rajouter des guillements autour des noms des variables dans lesquels j'ai mis des chaînes de caractères ? Pourquoi ? Dois-je utiliser des double crochets pour les tests sur les entiers ? Et pourquoi ?

    Merci d'avance,

    Rithy.

    PS:
    Sur la page internet que j'ai mis en lien il parle de "(( expression )) pour les expression numériques". Je ne comprend pas, pourriez-vous m'écrire un exemple simple ?

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Dans tes exemples:
    if [[ $var1 != $var2]]
    if [ "$var1" != "$var2" ] # Attention aux espaces ![/code]
    [ ] oblige à mettre les opérateurs entre guillemets au cas un l'un d'eux serait vide; Personellement je réserve le [[ ]] aux comparaisons approximatives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [[ A = [ABCD] ]] # retourne vrai car A est dans la liste ABCD
    A="lettreA"
    V=""
    [ $A = $V ] # revient à écrire [ lettreA = ] --> erreur
    [ "$A" = "$V" ] # ça passe car c'est comme écrire [ "lettreA" = "" ]
    (( )) : expansion arithmérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # au lieu d'écrire
    let "A=2+5"
    # on peut faire
    (( A=2+5 ))
    # comme test (( )) renvoie true si sa valeur est différente de zéro
    (( 2+2 )) # --> Vrai ($?=0)
    (( 2-2 )) # --> Faux ($?=1)
    En espérant que celai ait pu éclairer un peu ta lanterne...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 66
    Points : 51
    Points
    51
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [ $c1 -eq $c2 ] # --> erreur si c1 ou c2 est vide
    # peut être écrit
    if (( c1=c2 ))
    J'ai essayé ça..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c1=3
    c2=2
    if (( c1 = c2 ))
    then
      print "yes"
    else
      print "no"
    fi
    ou ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c1=3
    c2=2
    (( c1 = c2 )) && print "YES"
    Displays "YES" à chaque fois. Je crois qu'il y a un problème.
    T'es sûr de ton coup ^^ ?

    Tu as dis :
    "[ ] oblige à mettre les opérateurs entre guillemets au cas un l'un d'eux serait vide; Personellement je réserve le [[ ]] aux comparaisons approximatives"
    Pas seulement si l'un des opérateurs est vide mais aussi s'il contient un espace, genre var1 contient "JE" et var2 contient "JE PARS", il y aura une erreur d'opérande si on utilise les crochets simple sans entourer les noms des variables de guillemets. Sinon ça fait sens, par contre je comprends pas ce que tu entends par "comparaisons approximatives".

    Merci pour l'expansion arithmétique. Je préfère cette écriture à celle de let. Merci tout court.

  4. #4
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par Rithy666 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if [ $c1 -eq $c2 ] # --> erreur si c1 ou c2 est vide
    # peut être écrit
    if (( c1=c2 ))
    J'ai essayé ça..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c1=3
    c2=2
    if (( c1 = c2 ))
    then
      print "yes"
    else
      print "no"
    fi
    ou ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c1=3
    c2=2
    (( c1 = c2 )) && print "YES"
    Displays "YES" à chaque fois. Je crois qu'il y a un problème.
    T'es sûr de ton coup ^^ ?
    Oups ! j'ai déconné, en fait le raccourci que j'utilisais était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((c1-c2)) && echo "différence" || echo "égalité"
    je corrige le post pour éviter d'enduire d'erreurs d'autres passants !!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    quand tu utilises (( )), le test d'égalité est == ! Utiliser un = est un assignment comme dans la majorité des langages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    romain@lilibox:~$ c1=1
    romain@lilibox:~$ c2=2
    romain@lilibox:~$ (( c1 == c2 )) || echo "nope"
    nope
    romain@lilibox:~$ (( c1 = c2 )) || echo "nope"
    #En mettant les $ tu aurais tout de suite vu qu'il y avait un pb
    romain@lilibox:~$ (( $c1 = $c2 )) || echo "nope"
    bash: ((: 2 = 2 : attempted assignment to non-variable (error token is "= 2 ")
    nope
    Par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    romain@lilibox:~$ [ $c1 -eq $c2 ] || echo "nope"
    nope

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/02/2014, 12h29
  2. Réponses: 2
    Dernier message: 09/06/2006, 14h33
  3. incompréhension sur l'utilisation des sessions
    Par cladsam dans le forum Langage
    Réponses: 12
    Dernier message: 31/01/2006, 13h28
  4. 3 précisions sur l'utilisation des "std::vector"
    Par Invité dans le forum SL & STL
    Réponses: 9
    Dernier message: 10/01/2006, 01h42
  5. Compteur sur l'utilisation des index
    Par hkhan dans le forum Administration
    Réponses: 11
    Dernier message: 14/10/2004, 18h57

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