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 :

Échec cuisant face à la syntaxe d'un "if"


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Échec cuisant face à la syntaxe d'un "if"
    Bonjour, je découvre les joies du bash.

    Je souhaite détecter si le processus "synergyc" est lancé sur la machine distante nommée "packardbell", et si oui, il faudrait ensuite le tuer à l'aide d'un killall.

    Voilà ce que j'ai sué de mon front :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tmp=`ssh packardbell pgrep synergyc`
     
    if [ $tmp -gt 0 ] 
    then
    	ssh packardbell killall synergyc
    fi
    Résultat : -gt : opérateur unaire attendu

    En lancant le débuggeur je constate que $tmp est remplacé par une chaine vide, ce qui me permet de conclure qu'il faudrait convertir $tmp en entier mais mes recherches m'ont appris que bash était non typé.

    Est-ce que quelqu'un peut m'aider svp ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    Bonjour legumor,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh packardbell 'if (( $(pgrep -c synergyc) )); then killall synergyc; fi'
    ...
    ?

  3. #3
    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
    si c'est seulement pour faire un killall, pourquoi n epas ke faire directement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh packardbell killall synergyc
    Si le processus n'était pas lancé, le code de retour de killall est 1 et permet un éventuel traitement ultérieur.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de vos réponses.

    C'est "seulement" pour faire un killall en effet.

    Le if...fi sert à éviter les messages d'erreur "synergy : processus inexistant" si le processus n'existe pas.

    Je suis habituaient à php, je voulaient faire un error_reporting ( 0 ), lol

  5. #5
    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
    On peut très bien rediriger l'éventuel message d'erreur :

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour le tuyau, bash m'a tout l'air d'un langage fantastique, j'espere réaliser de chouettes progs...

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    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 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par legumor Voir le message
    Bonjour, je découvre les joies du bash.

    Je souhaite détecter si le processus "synergyc" est lancé sur la machine distante nommée "packardbell", et si oui, il faudrait ensuite le tuer à l'aide d'un killall.

    Voilà ce que j'ai sué de mon front :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    tmp=`ssh packardbell pgrep synergyc`
     
    if [ $tmp -gt 0 ] 
    then
    	ssh packardbell killall synergyc
    fi
    Résultat : -gt : opérateur unaire attendu

    En lancant le débuggeur je constate que $tmp est remplacé par une chaine vide, ce qui me permet de conclure qu'il faudrait convertir $tmp en entier mais mes recherches m'ont appris que bash était non typé.
    Exactement. Tu es tombé sur un cas courant où tu compares une variable non remplie. Le shell ne voyant rien à comparer ne sait plus trop où il en est et t'indique que l'opérateur binaire "-gt" n'est pas approprié. Et ton analyse pertinente (que peu de gens arrivent à faire à leurs débuts) est à ton honneur

    En général, quand la comparaison est textuelle (comparer une chaine avec une autre), il suffit d'encadrer la chaine par des guillemets
    Même si tmp est vide, le shell verra quand-même les guillemets et ne sera pas en défaut dû à un opérande manquant.
    Mais ici il s'agit d'une comparaison numérique et cette astuce ne peut pas être appliquée. Toutefois tu peux utiliser les opérateurs {} liés à la manipulation de variable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test ${tmp:-0} -gt 0
    L'opérateur ${var:-xxx} renverra $var si celle-ci est remplie. Sinon il renverra la chaine "xxx".
    Ainsi, si tmp est vide, l'expression renverra 0 et le shell verra quand-même quelque chose à comparer...

    Citation Envoyé par legumor Voir le message
    Merci pour le tuyau, bash m'a tout l'air d'un langage fantastique, j'espere réaliser de chouettes progs...
    Voir les cours de Shell Linux : http://linux.developpez.com/cours/

    C'est vrai que pour manipuler sur Unix/Linux le shell est très agréable. Mais si vraiment tu veux un langage fantastique, je te recommande d'essayer Python...

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 28/06/2007, 17h10

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