Problème script shell
lefreeman63
Messages postés
136
Date d'inscription
Statut
Membre
Dernière intervention
-
lefreeman63 Messages postés 136 Date d'inscription Statut Membre Dernière intervention -
lefreeman63 Messages postés 136 Date d'inscription Statut Membre Dernière intervention -
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:
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
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:
- Problème script shell
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Script cmd - Guide
5 réponses
Salut,
A adapter :
;-))
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 $
;-))
je crois quand faite je vais te montrer exactement mon code tu pourra mieux m'aider comme sa.
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
#!/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 $Ccontenu 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
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...
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...
voila c'est fait:
voici le retour
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
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
et apre dans mon "IF" j'ai un message d'erreur pour les egrep
egrep: not a recognized flag: o Usage : egrep [-r]...................................................
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
j' ai jamais vu 3"<<<" je me demandé si tu aurais m'y expliquer du coup?
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?
j dois avouer que sa me dépasse la... et que j'ai du ma a y réadapter a mon code
:-/
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é.