Comparaison script csh

Leduc08 -  
 tchoum -
Bonjour,
Je ne suis pas expert en script shell (csh dans ce cas précis), et je cherche la syntaxe pour une comparaison:
Le but est de tester si l'on se trouve bien sur un des noeuds d'un cluster de calcul, il y a donc un node1, un node2... jusque 4 pour l'instant...
Comment exprimer (comme dans un sed par exemple) le fait que le 5ème caractère puisse varier entre 1 et 4 (voir plus par la suite).
Voila mon test pour l'instant, merci de m'aider à remplacer les ???? ;-)

if ( `hostname` == ?????? ) then
echo "We are on a node"
else
echo "We are NOT on a node"
fi

D'avance merci.

LeDuc
Configuration: Linux Suse
Firefox 1.5.0.8

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,
    #! /bin/csh
    
    @ A = "$1"
    
    if ( "$A" > = 1 && "$A" < = 4 ) then
    echo "OK"
    else
    echo "NOK"
    endif
    Ce qui donne :
    $ ./foo.csh 2
    OK
    
    $ ./foo.csh 0
    NOK
    
    $ ./foo.csh 1
    OK
    
    $ ./foo.csh 5
    NOK
    $
    ;-))
    0
  2. Leduc08
     
    J'ai envie de te dire.... Formidable.
    Je teste dès que je peux et je te tiendrais au courant du résultat, mais cela me semble être ce que j'attendais...
    Merci.
    0
  3. Leduc08
     
    En fait ce n'est pas si facile que cela à imbriquer dans mon script...
    Le script dans le quel je fais ce test c'est le .login (j'aurai du préciser ce point avant). Je dois charger un path différent selon que le user se trouve sur un des nodes ou sur le master. J'ai certaine machines avec un hostname comportant 'node", je veux donc récupérer exclusivement les machine avec un hostname node$numero.

    J'aurai voulu quelque chose du genre expression rationnelle:

    if ( `hostname` == node[0-9] ) then
    echo "We are on a node"
    else
    echo "We are NOT on a node"
    fi

    Mais je ne sais pas si c'est possible sous csh.

    Le problème est que je ne peux pas récupérer le $A de ton script, en tout cas pas simplement, et comme c'est le point login je voudrais éviter de le charger avec des hostname, grep et sed...
    0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Le "csh" c'est obligé ?
    Parce qu'il est moins malléable que le bash ;-((
    0
    1. Leduc08
       
      Le csh en tant que shell par défaut est là d'un point de vu historique, bash et zsh n'étaient par implémenté d'origine sur Solaris 6. Le changer entrainerai trop de modifications...
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    C'est un peu lourd mais c'est tout ce que j'ai trouvé sur du "csh" :
    #! /bin/csh
    
    set var = "node$1"
    
    switch ("$var")
    case node0:
                    echo $var : OK; breaksw
    case node1:
                    echo $var : OK; breaksw
    case node2:
                    echo $var : OK; breaksw
    case node3:
                    echo $var : OK; breaksw
    case node4:
                    echo $var : OK; breaksw
    case node5:
                    echo $var : OK; breaksw
    case node6:
                    echo $var : OK; breaksw
    case node7:
                    echo $var : OK; breaksw
    case node8:
                    echo $var : OK; breaksw
    case node9:
                    echo $var : OK; breaksw
    default:
                    echo NOK; breaksw
    endsw
    Résultat des courses :
    $ csh bar.csh 2
    node2 : OK
    
    $ csh bar.csh 10
    NOK
    
    $ csh bar.csh 1
    node1 : OK
    
    $ csh bar.csh m
    NOK
    
    $ 
    ;-))
    0
    1. Leduc08
       
      Cela répond doublement à ma question:
      Maintenant je sais que ce genre de traitement en cshn'est pas simple et évident, mais en plus je sais comment faire !!!
      MERCI.
      0
      1. tchoum > Leduc08
         
        Salut,
        ceci peut être fait de façon très simple grâce à la commande expr:
        #! /bin/csh
        
        set MY_HOST=$1
        
        if ( `expr $MY_HOST : '^node[0-9]*$'` != 0 ) then
            echo OK
        else
            echo KO
        endif

        La commande expr retourne le nombre de caractères du paramètre qui correspondent à l'expression régulière. Dans cet exemple, l'expression régulière est très strict (on spécifie ce qui commence et termine la ligne) donc si le paramètre ne correspond pas, expr retourne 0.
        Voici le résultat lors de l'exécution du script:
        >truc node2
        OK
        >truc node54
        OK
        >truc mynode 
        KO
        >truc nodespe
        KO
        >truc node54spe
        KO

        Les avantages sont que le script est très court, qu'il est facile de le passer en sh si nécessaire et qu'il est facile de le maintenir en cas de changement de nom de machine.

        Olivier
        0