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] Condition sur valeur numérique


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut [BASH] Condition sur valeur numérique
    Bonjour,

    J'aimerais faire une condition sur la valeur de la taille d'un fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #! /bin/bash
     
    FileSize='stat -c "%s" <file.ext>'
     
    if [ $FileSize -gt 100000 ] 
    then echo "ok"
    else echo "non"
    fi
    FileSize est une chaine de caractère.. comment la passer en valeur numérique pour servir dans la condition?

    Merci d'avance
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par Newenda Voir le message
    FileSize est une chaîne de caractères..
    C'est vague...
    Quand tu l'exécutes, que reçoit exactement FileSize ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #! /bin/bash
     
    FileSize=$(stat -c "%s" <file.ext>)
     
    if [ "${FileSize}" -gt 100000 ] 
    then echo "ok"
    else echo "non"
    fi
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci, cela semble marcher.
    Cependant je me demandais pourquoi en définissant FileSize de cette manière:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ FileSize=$(stat -c "%s" <fichier.ext>)
    il me renvoyait un "commande introuvable" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ $FileSize
    13121743872: commande introuvable
    ?

    merci encore
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  5. #5
    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
    les accolades , quand il n'y a rien d'accolé, sont inutiles.
    ainsi que les guillemets autour de nombres, parce qu'ils sont "insécables".

    comment sait-on que c'est un nombre ?
    parce qu'on utilise un opérateur de comparaison arithmétique !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Citation Envoyé par Newenda Voir le message
    pourquoi en définissant FileSize de cette manière, il me renvoyait un "commande introuvable" ?
    As-tu réellement un logiciel, un script, un alias, ou un lien qui s'appelle 13121743872 ? Non ? Ben voilà. Tu as la réponse à ta question. On n'exécute pas 13121743872. La substitution de commande $( ) a rempli la variable FileSize avec le résultat de la commande. Si tu voulais l'afficher, il faudrait faire :
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    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 742
    Points
    12 742
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ $(stat --format "test %s -gt 100000" fichier2.txt) && echo ok || echo non
    non
    $ $(stat --format "test %s -gt 100" fichier2.txt) && echo ok || echo non
    ok
    Cordialement.

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut, (ça mange pas de pain)

    Citation Envoyé par N_BaH Voir le message
    les accolades , quand il n'y a rien d'accolé, sont inutiles.
    ainsi que les guillemets autour de nombres, parce qu'ils sont "insécables".
    T'es tout le temps en train de rouspéter après tous les zigues qui ne respectent pas les fondamentaux en shell, donc, même si c'est inutile, autant prendre de bonnes habitudes, non ?

    Bonne journée.
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci à tous ! chaque réponse m'a été utile.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  10. #10
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    même si c'est inutile, autant prendre de bonnes habitudes, non ?
    La bonne habitude ne serait-elle pas plutôt de savoir pourquoi on met des guillemets et des accolades, et de ne les mettre dès lors que quand il faut ?

  11. #11
    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
    T'es tout le temps en train de rouspéter après tous les zigues qui ne respectent pas les fondamentaux en shell, donc, même si c'est inutile, autant prendre de bonnes habitudes, non ?
    non, là, c'est comme étaler du beurre sur une tranche de quatre-quart, ou de saupoudrer du sucre sur une part de kouign amann.

    ici, le fondamentaux , je le redis, et je ne sais pas comment le dire autrement tellement ça me semble évident : si il n'y a rien d'accolé à la suite de la variable, les accolades ne sont pas nécessaires.
    or, si ce n'est pas indispensable, le faire est inutile.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    si il n'y a rien d'accolé à la suite de la variable, les accolades ne sont pas nécessaires.
    or, si ce n'est pas indispensable, le faire est inutile.
    Avec des SI on mettrait Paris en bouteille…

    Citation Envoyé par N_BaH
    comment sait-on que c'est un nombre ?
    parce qu'on utilise un opérateur de comparaison arithmétique !
    Encore faut-il être sûr de ce que contient la variable.
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Encore faut-il être sûr de ce que contient la variable.
    Je pense pareil.

    Soit un test anodin (sans guillemets puisque les nombres sont insécables dit-il).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test $zozo -eq 0;then echo OK;else echo bouh;fi
    Évidemment, dans un monde idéal, ça marche bien. Mais imaginons qu'à l'endroit où cette valeur est récupérée, un hacker a placé un code malicieux arbitraire; au sens anglais du terme, c'est-à-dire n'importe quel code que l'on souhaite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ zozo='-n "$(ls)" -o 0'
    $ if test $zozo -eq 0;then echo OK;else echo bouh;fi
    OK
    $ if test "$zozo" -eq 0;then echo OK;else echo bouh;fi
    -bash: test: -n "$(ls)" -o 0 : nombre entier attendu comme expression
    bouh
    Ohhhhh ! Quelle bonne idée d'avoir mis la variable entre guillemets ! Sinon, non seulement on peut exécuter du code arbitraire (ici "ls"), mais en plus, on peut forcer le branchement conditionnel en branchement inconditionnel (0 == 0). C'est le client qui ne va pas être content.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    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
    si quand il n'y a rien d'accolé...
    on part quand même du postulat qu'on va comparer des nombres puisqu'on utilise un opérateur de comparaison ARITHMÉTIQUE !!!

    si quand on ne sait pas ce que va contenir la variable, mais qu'on sait que ce doit être un nombre, on fait un teste en amont pour interrompre le script parce que le type de données ne correspond pas à ce qui est attendu, et que sinon le client ne sera pas content.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Ou alors, on en revient au C/C++. Il faut explicitement typer les variables dès le début.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ declare -i zozo
    $ zozo='-n "$(ls)" -o 0'
    -bash: -n "$(ls)" -o 0 : erreur de syntaxe : opérateur arithmétique non valable (le symbole erroné est «*"$(ls)" -o 0*»)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    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
    pas de problèmes; puisqu'on veut que la variable soit un nombre.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    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 742
    Points
    12 742
    Par défaut
    Dans ce cas précis, le mieux serait de passer, comme suggérer par Flodelarab, par un declare -i et de passer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    declare -i XX
    XX=<un nombre ou une commande qui envoi un nombre>
    # Et la syntaxe pour le test numérique correcte serait:
    [ ${XX:=0} -gt 1000 ]
    Dans le principe, on ne mettrait pas de guillemet car cela symbolise une chaine de caractère alors qu'ici on traite un nombre.
    Cordialement.

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

Discussions similaires

  1. [XL-2003] problème sur valeur numérique
    Par Chicard dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/08/2011, 10h35
  2. Requete sur valeurs numériques répétées
    Par BMATH dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/02/2011, 09h10
  3. Condition sur valeurs d'une gridview en edit mode
    Par badi3a82 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 29/11/2010, 16h59
  4. [XL-2003] Test à effectuer sur valeurs numériques (débutant VBA..)
    Par Clipper24 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/07/2010, 12h25
  5. [XSLT][ACCESS]condition sur valeur
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 23
    Dernier message: 10/01/2005, 14h14

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