Problème script shell

lefreeman63 Messages postés 139 Statut Membre -  
lefreeman63 Messages postés 139 Statut Membre -
Bonjour à tous,

je suis complètement bloquer.
je vous explique l'environnement;
j'ai des dossiers avec une convention de nomage comme par exemple (p_fr_01, p_fr_02, p_fr_03, p_gr_01, p_gr_02 , p_es_01, ........)

j'ai une commande qui me permet de récuperer tous les nom présent et je les stocke dans un tableau:

tabDSM=( ${B} )
echo ${tabDSM[*]}
p_fr_01 p_fr_02 p_fr_03 p_gr_01p_gr_02 p_es_01


je rentre un nom comme paramètre à mon script comme par exemple p_fr_
et maintenant je cherche à vérifier si mon nom existe déja dans mon tableau....
Si il n'existe pas je le crée avec 01 à la fin
Sinon si il existe, je voudrai récupèré le numéro à la fin le plus élevé, lui rajoute +1 et crée mon fichier à la suite des autre

donc dans mon exemple rentrer p_fr en paramètre et réussir à récupérer p_fr_04

si quelqu'un à une idée je suis preneur parceque moi j'ai plus d'idée la...

merci d'avance

5 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    A adapter :

    $ cat freeman.sh
    #! /bin/bash
    
    #set -xv
    
    tabDSM=( p_fr_01 p_fr_02 p_fr_03 p_gr_01 p_gr_02 p_es_01 )
    
    egrep -qo "${1}[^ ]*" <<<${tabDSM[@]}
    
    if [ "$?" -eq 1 ]
    then
            echo "Le répertoire n'existe pas, création en cours."
            echo "mkdir ${1}_01"
    else
            NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3)
            NUM=$(( $NUM + 1 ))
            NUM=$(echo ${NUM} | sed 's/^.$/0&/')
            echo "Le répertoire existe déjà, incrémentation de la valeur."
            echo "mkdir ${1}_${NUM}"
    fi
    
    $ ./freeman.sh p_us
    Le répertoire n'existe pas, création en cours.
    mkdir p_us_01
    
    $ ./freeman.sh p_fr
    Le répertoire existe déjà, incrémentation de la valeur.
    mkdir p_fr_04
    
    $ ./freeman.sh p_it
    Le répertoire n'existe pas, création en cours.
    mkdir p_it_01
    
    $ ./freeman.sh p_gr
    Le répertoire existe déjà, incrémentation de la valeur.
    mkdir p_gr_03
    
    $

    ;-))
    0
    1. lefreeman63 Messages postés 139 Statut Membre
       
      si je peux me permettre es ce que tu pourrais commenté un petit peu ton code...
      j dois avouer que sa me dépasse la... et que j'ai du ma a y réadapter a mon code
      :-/
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      tabDSM=( p_fr_01 p_fr_02 p_fr_03 p_gr_01 p_gr_02 p_es_01 )
      On initialise le tableau

      egrep -qo "${1}[^ ]*" <<<${tabDSM[@]}
      On vérifie que le paramètre ($1) existe (ou non) dans la variable.
      S'il existe la commande retournera un code retour égal à 0 (vrai) sinon elle retournera 1 (faux).
      man grep pour les explications sur les options "-o et -q"

      if [ "$?" -eq 1 ]
      On teste le code retour contenu dans la variable "$?".
      S'il est égal à 1 (faux)

      then
      echo "Le répertoire n'existe pas, création en cours."
      echo "mkdir ${1}_01"

      On crée un répertoire 01


      else
      Sinon s'il est égal à 0 (vrai)

      NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3)
      On récupère dans la variable "NUM" le numéro le plus élevé.
      Tout d'abord en extrayant de la variable tableau que les noms correspondant au paramètre $1 et leur chiffres. ce qui renvoie une liste des 3 p_fr_xx.
      Liste qu'on tri sur un critère numérique avec la commande "sort -n". (man sort)
      De cette liste on ne garde que la dernière ligne (chiffre le + élevé) avec "tail -1". (man tail)
      Et enfin on extrait le chiffre avec la commande "cut" (man cut)


      NUM=$(( $NUM + 1 ))
      On incrémente ce chiffre de +1

      NUM=$(echo ${NUM} | sed 's/^.$/0&/')
      Vu que l'incrémentation fait sauter le "0", ici on en rajoute un devant quand il n'y a qu'un seul chiffre (ce passage est facultatif)

      echo "Le répertoire existe déjà, incrémentation de la valeur."
      echo "mkdir ${1}_${NUM}"

      Et enfin on crée le répertoire avec le numéro incrémenté.
      0
  2. lefreeman63 Messages postés 139 Statut Membre
     
    je crois quand faite je vais te montrer exactement mon code tu pourra mieux m'aider comme sa.
    #!/bin/bash
    
    #set -xv
    
    B='pdls -c server -a none -x"-server-type destination-manager" ids_ccm:'
    tabDSM=( ${B} )
    echo ${tabDSM[*]}
    
    C='egrep -qo "${1}[^ ]*" <<<${tabDSM[@]}'
    echo $C
    contenu de tabDSM = dsm_car_01 dsm_fr_01 dsm_gr_01
    
    if [ "$?" -eq 1 ]
    then
            echo "Le serveur n'existe pas, création en cours."
           dsm="dsm_"${1}"_01"
           config_server -t dsm $dsm
    else
            NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3)
            NUM=$(( $NUM + 1 ))
            NUM=$(echo ${NUM} | sed 's/^.$/0&/')
            echo "Le serveur existe déjà, incrémentation de la valeur."
           dsm="dsm_"${1}"_"${NUM}
           echo $dsm
           config_server -t dsm $dsm
    fi


    la commande pdls me retorune le nom de mes serveur et je les stockes dans le tableau tabDSM
    et les commandes config_server me permette de crée mes serveur avec le code comme ceux-ci sa m'ajoute bien mon premier serveur dsm_fr_01 ou dsm_gr_01
    mais par contre en retapant "fr ou "gr" ben il arrive plus a lire le dernier numéro et donc à l'incrémenté et il essai de le rajouté donc avec 01 mais vu qu'il existe déja sa me met une erreur

    et je t'avoue que j'ai du mal a comprendre tes lignes donc pour comprendre l'erreur c'est trés dur lol

    merci d'avance et encore désolé de te déranger
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Mes explications en #3 ne font pas l'affaire ?

      Honnêtement d'après ce que tu dis et que tu as fait ça devrait fonctionner ;-\

      Essaye de décommenter la ligne "set -xv" et de relancer le script (avec un exemple qui foire) et poste le résultat...
      0
  3. lefreeman63 Messages postés 139 Statut Membre
     
    voila c'est fait:
    voici le retour

    B='pdls -c server -a none -x"-server-type destination-manager" ids_ccm:'
    pdls -c server -a none -x"-server-type destination-manager" ids_ccm:
    ++ pdls -c server -a none '-x-server-type destination-manager' ids_ccm:
    + B='dsm
    dsm_car_01
    dsm_es_01
    dsm_fr_01
    dsm_gr_01'
    tabDSM=( ${B} )
    + tabDSM=(${B})
    echo ${tabDSM[*]}
    + echo dsm dsm_car_01 dsm_es_01 dsm_fr_01 dsm_gr_01
    dsm dsm_car_01 dsm_es_01 dsm_fr_01 dsm_gr_01
    
    egrep -qo "${1}[^ ]*" <<<${tabDSM[@]}
    + egrep -qo 'es[^ ]*'
    
    if [ "$?" -eq 1 ]
    then
            echo "Le serveur n'existe pas, création en cours."
           dsm="dsm_"${1}"_01"
           config_server -t dsm $dsm
    else
            NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3)
    	echo "NUM 1: $NUM"
            NUM=$(( $NUM + 1 ))
            echo "NUM 1: $NUM"
            NUM=$(echo ${NUM} | sed 's/^.$/0&/')
            echo "NUM 1: $NUM"
            echo "Le serveur existe déjà, incrémentation de la valeur."
           dsm="dsm_"${1}"_"${NUM}
           echo $dsm
           config_server -t dsm $dsm
    fi
    + '[' 0 -eq 1 ']'
    egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3
    ++ cut -d_ -f3
    ++ tail -1
    ++ sort -n
    ++ egrep -o 'es[^ ]*'
    + NUM=
    + echo 'NUM 1: '
    NUM 1: 
    + NUM=1
    + echo 'NUM 1: 1'
    NUM 1: 1
    echo ${NUM} | sed 's/^.$/0&/'
    ++ sed 's/^.$/0&/'
    ++ echo 1
    + NUM=01
    + echo 'NUM 1: 01'
    NUM 1: 01
    + echo 'Le serveur existe déjà, incrémentation de la valeur.'
    Le serveur existe déjà, incrémentation de la valeur.
    + dsm=dsm_es_01
    + echo dsm_es_01
    dsm_es_01
    + config_server -t dsm dsm_es_01
    config_server : Could not create server dsm_es_01 because it already exists
    
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ok, j'ai pigé ;-))

      Bon je suppose que tu lances ton script avec juste "es" en paramètre ?

      Si oui, change :

      NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f3)


      par

      NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f2)
      0
    2. lefreeman63 Messages postés 139 Statut Membre
       
      sa marche divinement bien merci j'ai juste changer une ligne
      NUM=$((10#$NUM + 1 ))
      parceque sinon apres 08 il planté maintenant niquel

      MERCI encore pour ton aide!!!
      0
    3. lefreeman63 Messages postés 139 Statut Membre
       
      Désolé de te redéranger. mais je viens de basculer mon script sur un AIX et l'option "-o" ne marche pas sous AIX du coup le cript ne marche plus.

      es ce que tu aurais une solution pour contourner ce problème???

      Merci
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Essaye avec :

      sed 's/ /\n/g' <<<${tabDSM[@]} | sed -n 's/.*\('"${1}"'.*\)/\1/p'

      en remplacement de :
      egrep -o "${1}[^ ]*" <<<${tabDSM[@]}
      0
    5. lefreeman63 Messages postés 139 Statut Membre
       
      sa ne me m'est pas de message d'erreur à ce niveaux la mais il rentre obligatoirement dans le else avec cette ligne. meme quand il doit crée le premier il ne rentre pas le then.
      et apre dans mon "IF" j'ai un message d'erreur pour les egrep

      egrep: not a recognized flag: o
      Usage : egrep  [-r]...................................................
      
      0
  4. lefreeman63 Messages postés 139 Statut Membre
     
    echo "Execution Order pdls -c server -a none -x"-server-type destination-manager" ids_ccm: " >> $LOG
    B='pdls -c server -a none -x"-server-type destination-manager" ids_ccm:'
    writeLog $? "110"
    tabDSM=( ${B} )
    #checks if the name entered in this parameter is in table
    echo "Execution Order egrep -qo "${1}[^ ]*" <<<${tabDSM[@]} " >> $LOG
    egrep -qo "${1}[^ ]*" <<<${tabDSM[@]}
    if [ "$?" -eq 1 ]
    then
            dsm="dsm_"${1}"_01"
    	echo "Execution Order config_server -t dsm $dsm" >> $LOG
            config_server -t dsm $dsm
    	writeLog $? "120"
    else
    	#extract from the table containing the names enterd in the parameter extracted the highest number
    	NUM=$(egrep -o "${1}[^ ]*" <<<${tabDSM[@]} | sort -n | tail -1 | cut -d'_' -f2)
            NUM=$((10#$NUM+ 1 ))
            NUM=$(echo ${NUM} | sed 's/^.$/0&/')
         	dsm="dsm_"${1}"_"${NUM}
    	echo "Execution Order config_server -t dsm $dsm" >> $LOG
           	config_server -t dsm $dsm
    	writeLog $? "121"
    fi
    0
    1. lefreeman63 Messages postés 139 Statut Membre
       
      sa c la version sans la modif avec le sed
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Essaie comme ça :

      echo "Execution Order pdls -c server -a none -x"-server-type destination-manager" ids_ccm: " >> $LOG
      B='pdls -c server -a none -x"-server-type destination-manager" ids_ccm:'
      writeLog $? "110"
      tabDSM=( ${B} )
      #checks if the name entered in this parameter is in table
      echo "Execution Order egrep -qo "${1}[^ ]*" <<<${tabDSM[@]} " >> $LOG

      grep -q "_${1}_" <<<${tabDSM[@]}

      if [ "$?" -eq 1 ]
      then
      dsm="dsm_"${1}"_01"
      echo "Execution Order config_server -t dsm $dsm" >> $LOG
      config_server -t dsm $dsm
      writeLog $? "120"
      else
      #extract from the table containing the names enterd in the parameter extracted the highest number
      NUM=$(sed 's/ /\n/g' <<<${tabDSM[@]} | sed -n 's/.*\('"${1}"'.*\)/\1/p' | sort -n | tail -1 | cut -d'_' -f2)
      NUM=$((10#$NUM+ 1 ))
      NUM=$(echo ${NUM} | sed 's/^.$/0&/')
      dsm="dsm_"${1}"_"${NUM}
      echo "Execution Order config_server -t dsm $dsm" >> $LOG
      config_server -t dsm $dsm
      writeLog $? "121"
      fi
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lefreeman63 Messages postés 139 Statut Membre
     
    j'ai reussi à modifier et simplifier mon script grace au tiens et maintenant sa marche.
    Merci encore

    J'aurai une petite question pour ma culture personnel par contre
    sed 's/ /\n/g' <<<${tabDSM[@]}


    j' ai jamais vu 3"<<<" je me demandé si tu aurais m'y expliquer du coup?
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      C'est un peu l'équivalent de la redirection d'un fichier avec "< fichier" ou de "<< EOF", mais appliquer à une chaine de caractère, en fait c'est la syntaxe pour lire depuis la ligne de commande :

      $ echo "il fait beau" | wc -c
      13
      $ wc -c <<<'il fait beau'
      13
      $
      
      0
    2. lefreeman63 Messages postés 139 Statut Membre
       
      Ben Merci encore pour ton aide
      0