Problème script shell

Fermé
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016 - 4 mai 2011 à 15:44
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016 - 16 mai 2011 à 16:48
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
A voir également:

5 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
4 mai 2011 à 17:17
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
5 mai 2011 à 13:15
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
5 mai 2011 à 13:41
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
5 mai 2011 à 13:51
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
5 mai 2011 à 14:09
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
5 mai 2011 à 14:55
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
5 mai 2011 à 15:25
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
5 mai 2011 à 15:37
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 08:38
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 mai 2011 à 09:42
Essaye avec :

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

en remplacement de :
egrep -o "${1}[^ ]*" <<<${tabDSM[@]}
0
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 10:36
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 10:44
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 10:45
sa c la version sans la modif avec le sed
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 mai 2011 à 10:52
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 16:30
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 mai 2011 à 16:35
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
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
16 mai 2011 à 16:48
Ben Merci encore pour ton aide
0