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 :

De l'existence d'une variable


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Pour moi, c'est plus 2 et 3 dans cette formulation pour test -v <-- ici on interroge l'ensemble pas le sujet lui-même
    et le 3b devrait passer en 4 pour test -n <-- ici on interroge le sujet lui même
    Cordialement.

  2. #22
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    test -v est un "bashisme".
    Ah bon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % ksh
    $ echo $0
    ksh
    $ unset x; if test -v x; then echo 'x set'; else echo 'x unset'; fi
    x unset
    $ declare x; if test -v x; then echo 'x set'; else echo 'x unset'; fi
    ksh: declare: not found
    x unset
    $ x=''; if test -v x; then echo 'x set'; else echo 'x unset'; fi     
    x set
    Si ça se trouve, mon ksh fait de la bashite aiguë...

  3. #23
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour moi, '' est une chaine vide.
    Et, pour moi, une chaine vide est une valeur. Vide, mais une valeur quand même...

    Dans d'autres langages, il y a vraiment une différence entre x=NULL (pointeur vers rien) et x="" (pointeur vers une chaine vide allouée quelque part).

    Pour moi, le test shell test -n "$v" est vrai lorsque la variable est assignée et son contenu est "une valeur non vide".

    Ou bien il est faux lorsque soit la variable n'est pas assignée (unset) soit la variable est assignée, mais contient une chaine vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ unset x; if test -n "$x"; then echo 'x set'; else echo 'x unset or empty'; fi
    x unset or empty
    $ x=''; if test -n "$x"; then echo 'x set'; else echo 'x unset or empty'; fi   
    x unset or empty
    $ x='y'; if test -n "$x"; then echo 'x set'; else echo 'x unset or empty'; fi
    x set

  4. #24
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Et, pour moi, une chaine vide est une valeur. Vide, mais une valeur quand même...
    Effectivement là tu mets le doigt sur un détail important.
    Jusqu'à hier, je ne voyais pas (en shell) comment dire "cette variable existe mais n'a pas de valeur". Car écrire var="" crée une chaine vide mais qui correspond à quelque chose. Si je devais faire le parallèle avec la bdd, une colonne avec contrainte unique peut avoir plein de null dans les différentes lignes qui remplissent la table mais n'aura qu'une et une seule chaine vide.

    Or hier, N_Bah a donné cette instruction declare var (je la connaissais pour les tableaux mais je n'avais jamais songé à l'utliser directement de cette façon). Et il semble donc que cette instruction permette de faire la différence entre "variable contenant chaine vide" et "variable ne contenant rien".

    Ceci dit, comme je l'ai dit hier, je ne vois pas encore dans quelle situation cela pourrait me servir. Surtout que même un test -z $var ne permet pas de distinguer le cas "variable ne contenant rien" et "variable contenant une chaine vide".
    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]

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 743
    Points
    12 743
    Par défaut
    normal, le '-z' et le '-n' vérifie l'état d'une string pas d'une variable
    Cordialement.

  6. #26
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour moi, c'est plus 2 et 3 dans cette formulation pour test -v <-- ici on interroge l'ensemble pas le sujet lui-même
    et le 3b devrait passer en 4 pour test -n <-- ici on interroge le sujet lui même
    Ben oui.

    [partiellement HS]
    La plupart du temps, j'ai travaillé avec des langages à pointeurs (lisp, LOGO, smalltalk, Objective-C, java, etc.).

    Dans certains de ces langages, une variable est une entité de première classe, elle peut être manipulée comme un élément du langage.

    Ainsi, en lisp, on peut demander à une variable son nom, sa valeur, sa plist, etc.
    On peut mettre une variable (un symbole, et non la "valeur" de la variable) en contenu d'une autre variable.

    Souvent le langage offre des raccourcis pour accéder à la valeur d'une variable. Ainsi, pour accéder à la valeur contenue dans la variable dont le nom est "x", en lisp, on écrit beaucoup plus souvent x que (symbol-value 'x) (ou que (symbol-value (intern "x")) !)

    De même pour l'affectation, on écrira plus (setq x (quelque chose)) que (set 'x (quelque chose)). Entre autres, parce que ça aide considérablement les compilateurs dans un contexte lexical pour produire du code efficace.

    Du coup, il faut que le langage ait des formes spéciales (comme les macros, par exemple), de manière à ce que certains morceaux ne soient pas évalués. Dans (setq x (quelque chose)), la forme spéciale "setq" prend son premier argument tel quel, non évalué, l'objet "la variable x", vérifie que c'est bien un symbole, puis évalue le deuxième argument (quelque chose), qui doit retourner quelque chose, et enfin met cette valeur retournée dans le slot "symbol-value" de la variable x.

    En LOGO, on n'a pas de SETQ. Du coup, on doit bien distinguer les variables de leur contenu, par exemple (SET "X :Y) met dans la variable dont le nom est "X" le contenu de la variable dont le nom est "Y".

    En bash et dans d'autres langages, on distingue les l-value (grosso modo à gauche du signe "=") des r-values (grosso modo à droite du signe "=").

    J'imagine que le test test -v v considère l'argument suivant le "-v" comme le nom d'une variable et va chercher, quelque part dans l'environnement du shell, s'il y a une assignation/correspondance entre ce nom de variable et une valeur (même une chaine vide).

    Alors que le test test -n "$v" commence probablement par construire une chaine (délimitée par les guillemets) dans laquelle il fait l'expansion des variables. J'imagine que, voyant la "chaine" de 2 caractères $v, il se rend compte qu'il doit trouver la valeur de la variable dont le nom est "v" et, pour ce faire, il va chercher quelque part dans l'environnement du shell, s'il y a une assignation/correspondance entre ce nom de variable et une valeur, puis, s'il n'y en a pas et que l'option "nounset" est positionnée par set -u, il déclenche une erreur ou bien sinon il remplace la "chaine" de 2 caractères $v par la valeur contenue dans la variable dont le nom est "v" (ou par une chaine vide s'il ne trouve pas de correspondance) et ensuite il fait le test correspondant à l'option "-n", c'est-à-dire vérifier si cette chaine est vide... Ouf !

    Félicitations à ceux qui ont réussi à perdre leur temps à tout lire !
    [/partiellement HS]

  7. #27
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Pour la dernière partie de ton commentaire HS sur le shell et les variables, en fait le shell interprète d'abord les variables de la ligne puis ensuite il interprète le reste, ce que je veux dire par là, c'est qu'il n'a auncune notion de la commande qui va s'éxécuter lorsqu'il interprète les variables.

    Bon après, j'ai lu ton message en diagonale, c'est peut-être ce que tu disais.
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Citation Envoyé par NBaH
    test -v est un "bashisme".
    Ah bon ?
    Si ça se trouve, mon ksh fait de la bashite aiguë...
    beaucoup de "bashismes" (d'où les guillemets ) existaient au préalable dans d'autres interpréteurs de commande.
    je dis "bashisme" par opposition à POSIXsms
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #29
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour la dernière partie de ton commentaire HS sur le shell et les variables, en fait le shell interprète d'abord les variables de la ligne puis ensuite il interprète le reste, ce que je veux dire par là, c'est qu'il n'a auncune notion de la commande qui va s'éxécuter lorsqu'il interprète les variables.
    Oui, tu as certainement raison. Je ne connais pas du tout l'implémentation (ni les spécifications détaillées) de l'interprète shell (bash ou autre), mais j'imagine que, lors de la phase d'analyse lexicale, le parser doit quand même générer des tokens différents pour '$v' et "$v", avant de remplacer, à bon escient, le bout de chaine $v par la valeur de la variable v...

  10. #30
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    mais j'imagine que, lors de la phase d'analyse lexicale, le parser doit quand même générer des tokens différents pour '$v' et "$v"
    Surtout que les quotes simples inhibent l'action du $ => '$v' est donc simplement "caractère dollar + caractère v"...
    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]

Discussions similaires

  1. Tester l'existence d'une variable?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/03/2006, 21h53
  2. [LG] Contrôle d'existence d'une variable ?
    Par Aenigma dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2005, 06h59
  3. Réponses: 3
    Dernier message: 19/08/2005, 14h24
  4. Réponses: 3
    Dernier message: 05/04/2005, 14h36
  5. [C#] Tester existence d'une variable de session
    Par IDNoires dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/12/2004, 12h30

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