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 :

integer expression expected


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut integer expression expected
    Bonjour,
    Je passe la commande suivante sur un terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps -eo comme,PID,estimes | grep hello | awk '{if ($3}>100} {printf $3}}' | wc -l
    Qui marche parfaitement mais quand je l'intègre à un script Bash

    J'ai une erreur de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [: : integer expression expected
    Que puis je faire svp?
    Dernière modification par N_BaH ; 24/02/2022 à 17h12.

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

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

    les Développement des paramètres (voir cette expression dans le man bash) doivent être toujours mis entre guillemets. TOUJOURS !
    à moins de savoir pourquoi.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Re bonjour,
    Je suis passé sur un PC ça va grandement nous simplifier vie

    Voilà ma commande de base jouée sur un terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ps -eo comm,pid,etimes | grep hello | awk '{if ($3 > 100) { print $3}}'
    7
    Dans mon script j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     control=$(sudo -u inspec bash -c 'ps -eo comm,pid,etimes | grep hello | awk '{if ($3 > 100)'')
            echo "test: "$control;
    Le retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    hello.sh: command substitution: line 23: syntax error near unexpected token `('
    hello.sh: command substitution: line 23: `sudo -u inspec bash -c 'ps -eo comm,pid,etimes | grep hello | { print $3}}'
    test:
    hello.sh: line 25: [: : integer expression expected
    Man bash "Les arguments nuls implicites, résultant du développement des paramètres n'ayant pas de valeurs, sont éliminés"

    Par contre je ne vois rien de choquant

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    pourquoi sudo ?
    pourquoi bash -c ?

    et pourquoi grep ? là, c'est pour chipoter parce que awk peut faire ce que fait ce grep.
    d'ailleurs, tu cherches quoi avec "hello" ?

    il est très compliqué, voire impossible, d'imbriquer des apostrophes.
    d'où mes deux premières questions ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Invité
    Invité(e)
    Par défaut
    pour le faire via un user précis, mais je pense que je peux l'enlever sans trop de problème

    Hello c'est un process, on doit donc regarder son occurrence

    Et le grep pour ne récupérer que ce process

    En modifiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    control=$(ps -eo comm,pid,etimes | grep hello | awk '{if ($3 > 100) { print $1}}';)
            echo "test: "$control;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ bash hello.sh
    test:
    hello.sh: line 25: [: : integer expression expected
    Dernière modification par Invité ; 24/02/2022 à 18h09.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    si tu connais le nom du processus recherché tu devrais pouvoir simplifier la commande ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nomProcess='hello'
    control=$(ps h -C "$nomProcess" -o etimes) # si la variable n'est pas réutilisée, on peut mettre la Substitution de commandes directement dans le if
    if test $control -gt 100 # je ne mets pas de guillemets parce que etimes est forcément   un nombre entier (une valeur insécable)
    then
       : faire ce qu il y a à faire
    fi
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est pas bête de faire comme ça je n'y avais pas pensée

    Par contre dans le if j'utilise -ge

    mais je le message -ge command not found

    C'est très bizarre ça

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ok c'est bon par contre quand je fais un echo de control c'est vide

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ce qui se passe c'est que je pense que control=$(ps h -C "$nomProcess" -o etimes ne contient pas un int

    Donc quand je fais le echo ou le if ça ne marche pas

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    ce sera plus simple en nous montrant le script. il est long ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Non vraiment pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/bin/bash
     
     
            numProcess=$(ps -eo comm,pid,etimes | grep hello | awk '{if ($3 > 1) { print $1}}')
     
            echo test $numProcess;
     
            if [ $numProcess -gt 5 ]
                then
     
                  printf "Dépassement du nombre de process HELLO"            
     
            fi

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    numProcess n'est pas un nombre, puisque tu demandes à awk d'afficher (sous condition) le premier champ (comm, c'est-à-dire le nom de la commande, et pas le etimes), qui soit ne contient rien (condition non rencontrée), soit du texte (le nom de la commande).

    on en revient à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    # on vérifie que le processus tourne effectivement
    # ET alors on peut tester que son etimes est supérieur à 5
    if pidof -qx hello && test $(ps h -C hello -o etimes) -gt 5 
    then
        echo "dépassement"
    fi
    on peut séparer pidof et ps pour avoir un contrôle plus sur le déroulement du script.

    il faut aussi qu'il n'y ait qu'un seul processus hello, sinon la Substitution de commandes ne retourne pas un entier, mais une liste d'entiers.
    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
     
    declare -i nbP
    nomProcess='hello'
     
    if pidof -qx "$nomProcess"
    then
        for etime in $(ps h -C "$nomProcess" -o etimes)
        do
            test $etime -gt 5 && nbP+=1
        done
    fi
    ((nbP)) && echo "il y a $nbP processus $nomProcess au-délà de 5"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Alors pour le coup ça marche plutôt bien.
    Par contre si je ne dis pas de bêtises le 5 c'est le temps en secondes depuis le lancement du process.
    Mais je remarque qu'il me manque une fonctionnalité.
    Effectivement il faut que je m'assure que j'ai moins de 5 process hello en cours et que ces process sont actif depuis plus de 10 minutes. Si c'est le cas on fait un écho dépassement

    Sinon pour revenir à numProcess, ok effectivement avec awk j'affiche le nom par contre après je fais un WC donc normalement je stocke dans ma variable un entier ?

    D'ailleurs m commande directement dans un terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ps -eo comm,pid,etimes | grep hello | awk '{if ($3 > 1) { print $1}}'| wc -l
    Renvoie bien un entier

    En sachant que ce n'est pas primordial (bien au contraire) d'afficher le PID, le nom du process ou autre
    Dernière modification par Invité ; 24/02/2022 à 22h04.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Sinon pour revenir à numProcess, ok effectivement avec awk j'affiche le nom par contre après je fais un WC donc normalement je stocke dans ma variable un entier ?
    oui, mais c'est "circonvolutif".

    il faut que
    je m'assure que j'ai moins de 5 process hello en cours et que
    ces process sont actif depuis plus de 10 minutes.
    Si c'est le cas on fait un écho dépassement
    d'accord, je n'avais pas tout compris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
    nomProcess='hello'
     
    procPIDs=( $(pidof -x "$nomProcess") )
    nbPIDs=${#procPIDs[*]}
     
    (( nbPIDs < 5 )) && { >&2 echo "pas assez de processus en cours."; exit 1;}
    etimes=( $(ps h -P ${procPIDs[@]}) -o etimes) )
    (( $(IFS='+'; echo "${etimes[*]}") > 10*60*$nbPIDs )) && echo "dépassement"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oulala c'est super complexe.

    Question très bête mais ma première proposition (PS+grep+awk+WC) n'était pas viable?, parce-que bien. Que ce n'était peut être la façon de faire je comprenais. Vraiment les étapes.
    Là pour être honnête j'ai plus de mal

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    version étendue (POSIX):
    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
    #!/bin/sh
     
    nomProcess='hello'
     
    for etime in $(ps h -P "$nomProcess" -o etimes)
    do
        nbProcess=$(( $nbProcess + 1 ))
        dureeTotale=$(( $dureeTotale + $etime ))
    done
     
    if test ${nbProcess=-0} -ge 5
    then
        if test ${dureeTotale:-0} -ge $(( 10 * 60 * $nbProcess ))
        then
            echo "dépassement"
        fi
    fi
    sauf erreur.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Citation Envoyé par tipo34 Voir le message
    Oulala c'est super complexe.
    c'est du bash.

    Question très bête mais ma première proposition (PS+grep+awk+WC) n'était pas viable?, parce-que bien. Que ce n'était peut être la façon de faire je comprenais. Vraiment les étapes.
    Là pour être honnête j'ai plus de mal
    comme je te l'ai dit grep|awk est inutile, et awk|wc aussi, parce que awk sait et traiter des regex, et compter.
    mais le recours à une regex n'est pas indispensable, puisque ps peut retrouver les informations d'un processus par son nom, ou par son/ses PID(s).

    donc cette ligne, aussi compréhensible qu'elle soit, est superfétatoire.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Alors si je comprends bien, je peux éventuellement garder ma première version mais en ne gardant que awk après le PS?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    éventuellement. Mais c'est faire faire, à un autre langage de programmation, ce que peut faire le shell, à sa manière.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Invité
    Invité(e)
    Par défaut
    Oui, mais je vais essayer de faire une version "nulle" et une fois qu'elle sera fonctionnelle j'essaierai Les versions intelligentes.

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ps -eo comm,pid,etimes | awk '{if ($1=="Hello" && $3 > 1) { print $1}}'
    Est ce que je fais fausse route avec cette logique ?

Discussions similaires

  1. Filtre conditionnel en bash (awk ou autre commande)
    Par alberick dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 04/05/2020, 16h20
  2. bash, awk etc
    Par dg1234 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 20/04/2013, 14h35
  3. AWK : traitement de fichier
    Par zeus2005 dans le forum Applications et environnements graphiques
    Réponses: 8
    Dernier message: 16/06/2007, 22h24
  4. probleme de récupération de variable en bash avec awk
    Par avogadro dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/12/2006, 01h31
  5. Réponses: 33
    Dernier message: 15/10/2004, 16h19

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