Shell ->Trie chaine de caractère et insertion
Maillon
Messages postés
156
Date d'inscription
Statut
Membre
Dernière intervention
-
Maillon Messages postés 156 Date d'inscription Statut Membre Dernière intervention -
Maillon Messages postés 156 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
voilà j'ai un script qui ajoute automatiquement des vhost au fichier de conf d'apache2 (debian).
Le script demande à l'utilisateur de saisir le nom de son Vhost et celui si est crée et ajouté à la fin dans le fichier de conf de apache2.
Seulement j'aimerai qu'au lieu de l'ajouter à la fin, le vhost soit insérer dans le fichier par ordre alphabétique.
Voilà à quoi ressemble mon script pour l'instant :
echo "1 - Add vhost- "
echo "2 - - "
echo "3 - - "
echo "4 - Quit - "
echo ""
echo " Select your option :"
read input
DIR="/etc/apache2"
FILE="/etc/apache2/sites-avalaible/vhost.conf"
case $input in
1)
echo ""
echo "Enter the vhost Name : "
read vhost
if [ -d $DIR ]
then
cd $DIR
if [ -f vhost.conf ]
then
## Convert vhost Name
tmp=`echo $vhost | tr "A-Z" "a-z"`
doc=`echo $tmp | sed -e "s/ /_/g"`
server=`echo $tmp | sed -e "s/ /-/g"`
## Add in vhost file
echo >> $FILE
echo "#############################################" >> $FILE
echo "#-- $vhost" >> $FILE
echo "#############################################" >> $FILE
echo "<VirtualHost *>" >> $FILE
echo " ServerAdmin root@dmaine" >> $FILE
echo " DocumentRoot /var/www/site/vhost/$doc" >> $FILE
echo " ServerName $server.machine" >> $FILE
echo " ServerAlias www.$server.machine $server.machine.domaine" >> $FILE
echo " ErrorLog log/error_vhost-fr.log" >> $FILE
echo "</VirtualHost>" >> $FILE
echo ""
echo "vhost added"
...
Le script fonctionne en ce qui concerne l'ajout de vhost dans le fichier de conf.
Je pense qu'il faudrai faire un awk sur le nom du vhost déjà (car il peut y avoir des espaces dans le nom) et une fois cela fait bah... che pas trop lol
Merci pour votre aide.
voilà j'ai un script qui ajoute automatiquement des vhost au fichier de conf d'apache2 (debian).
Le script demande à l'utilisateur de saisir le nom de son Vhost et celui si est crée et ajouté à la fin dans le fichier de conf de apache2.
Seulement j'aimerai qu'au lieu de l'ajouter à la fin, le vhost soit insérer dans le fichier par ordre alphabétique.
Voilà à quoi ressemble mon script pour l'instant :
echo "1 - Add vhost- "
echo "2 - - "
echo "3 - - "
echo "4 - Quit - "
echo ""
echo " Select your option :"
read input
DIR="/etc/apache2"
FILE="/etc/apache2/sites-avalaible/vhost.conf"
case $input in
1)
echo ""
echo "Enter the vhost Name : "
read vhost
if [ -d $DIR ]
then
cd $DIR
if [ -f vhost.conf ]
then
## Convert vhost Name
tmp=`echo $vhost | tr "A-Z" "a-z"`
doc=`echo $tmp | sed -e "s/ /_/g"`
server=`echo $tmp | sed -e "s/ /-/g"`
## Add in vhost file
echo >> $FILE
echo "#############################################" >> $FILE
echo "#-- $vhost" >> $FILE
echo "#############################################" >> $FILE
echo "<VirtualHost *>" >> $FILE
echo " ServerAdmin root@dmaine" >> $FILE
echo " DocumentRoot /var/www/site/vhost/$doc" >> $FILE
echo " ServerName $server.machine" >> $FILE
echo " ServerAlias www.$server.machine $server.machine.domaine" >> $FILE
echo " ErrorLog log/error_vhost-fr.log" >> $FILE
echo "</VirtualHost>" >> $FILE
echo ""
echo "vhost added"
...
Le script fonctionne en ce qui concerne l'ajout de vhost dans le fichier de conf.
Je pense qu'il faudrai faire un awk sur le nom du vhost déjà (car il peut y avoir des espaces dans le nom) et une fois cela fait bah... che pas trop lol
Merci pour votre aide.
A voir également:
- Shell ->Trie chaine de caractère et insertion
- Caractère ascii - Guide
- Classic shell - Télécharger - Personnalisation
- Caractère spéciaux - Guide
- Caractere speciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
11 réponses
Salut,
Voilà un bout de code susceptible de marcher. Mais j'ai fait avec ce que tu as donné comme détails en supposant que :
- toutes tes balises <VirtualHost *> commencent par 3 lignes de commentaires où se trouve le nom de l'hôte virtuel
- le classement alphabétique se base sur le nom de l'hôte virtuel dans les 3 lignes de commentaires
- le tri est fait sur le1er caractère du nom
- je n'ai pas traité les chiffres
- les hôtes existants soient déjà triés
Les ajouts sont en gras
Essaie comme ça, aucune modification n'est apportée au fichier original, si ça marche bien tu pourras rajouter l'option "-i.BAK" à sed afin que les mofis soient faites sur le fichier original tout en faisant une copie de sauvegarde.
Voilà un bout de code susceptible de marcher. Mais j'ai fait avec ce que tu as donné comme détails en supposant que :
- toutes tes balises <VirtualHost *> commencent par 3 lignes de commentaires où se trouve le nom de l'hôte virtuel
- le classement alphabétique se base sur le nom de l'hôte virtuel dans les 3 lignes de commentaires
- le tri est fait sur le1er caractère du nom
- je n'ai pas traité les chiffres
- les hôtes existants soient déjà triés
Les ajouts sont en gras
#! /bin/bash echo "1 - Add vhost- " echo "2 - - " echo "3 - - " echo "4 - Quit - " echo "" echo " Select your option :" read input DIR="/etc/apache2" FILE="/etc/apache2/sites-avalaible/vhost.conf" case "$input" in 1) echo "" echo "Enter the vhost Name : " read vhost ;; 4) echo "Bye bye" exit 1 ;; *) echo "Mauvais choix" exit 2 ;; esac if [ -d $DIR ] then cd $DIR else exit fi if [ -f plop ] then ## Convert vhost Name tmp=$(echo $vhost | tr "A-Z" "a-z") doc=$(echo $tmp | sed -e "s/ /_/g") server=$(echo $tmp | sed -e "s/ /-/g") ## Add in vhost file # Liste des hotes virtuels existant liste=$(sed -n '/^#-- /{s///;p}' $FILE) # Récupération dans la liste du nom qui suit le nouvel hôte suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}") # Récupération du numéro de ligne dans le fichier num=$(sed -n "/#-- $suivant/=" $FILE) # Décrémentation du numéro number=$(($num-1)) # L'ajout proprement dit sed ' '"$number"' i\ #############################################\ #-- '"$vhost"'\ #############################################\ <VirtualHost *>\ ServerAdmin root@dmaine\ DocumentRoot /var/www/site/vhost/'"$doc"'\ ServerName '"$server"'.machine\ ServerAlias www.'"$server"'.machine '"$server"'.machine.domaine\ ErrorLog log/error_vhost-fr.log\ </VirtualHost> ' "$FILE" echo "" echo "OK" else exit fiL'insertion se fait avant, de ce fait je n'ai pas tenu compte du fait que le nouvel hôte pouvait être le dernier de la liste alphabétique (à toi de voir en rajoutant par exemple une ligne comme "#-- zzz" à la fin de ton fichier "vhost.conf" pour parer à cette éventualité).
Essaie comme ça, aucune modification n'est apportée au fichier original, si ça marche bien tu pourras rajouter l'option "-i.BAK" à sed afin que les mofis soient faites sur le fichier original tout en faisant une copie de sauvegarde.
Oki j'essaye ça dans la journée je te dis ça ^^ merci de t'être penché sur mon problème (encore ^^) ;-)
Bon alors, tapes ces commandes dans un terminal :
FILE="/home/maillon/vhost.test" vhost="Ding Dong" liste=$(sed -n '/^#-- /{s///;p}' $FILE) echo "$liste" suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}") echo "$suivant" num=$(sed -n "/#-- $suivant/=" $FILE) echo "$num" number=$(($num-1)) echo "$number"et colles le résultat s'il te plaît.
Ne colle rien dans un fichier, exécute les commandes une par une à partir d'un terminal. A la limite active le débugage (set -xv) avant pour voir d'éventuels bugs ("set -" pour revenir à la normale).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai commenter tout le fichier et decommenter au fur et à mesure.
Alors ça ça marche :
FILE="/home/maillon/vhost.test"
vhost="Ding Dong"
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
echo "$liste"
Par contre dès que je décommente ça :
suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
echo "$suivant"
ça marche pas il me met la même erreur :
essai: 7: Syntax error: Missing '))'
echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
++ echo -ne '\033]0;maillon@machine: /home/maillon\007'
J'aurai pas besoin d'une librairie ? ou d'un path ? ou autre chose pour faire fonctionner ce que tu met ?
Alors ça ça marche :
FILE="/home/maillon/vhost.test"
vhost="Ding Dong"
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
echo "$liste"
Par contre dès que je décommente ça :
suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
echo "$suivant"
ça marche pas il me met la même erreur :
essai: 7: Syntax error: Missing '))'
echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
++ echo -ne '\033]0;maillon@machine: /home/maillon\007'
J'aurai pas besoin d'une librairie ? ou d'un path ? ou autre chose pour faire fonctionner ce que tu met ?
Essaie d'écrire la commande comme ça alors :
Sinon essaye de décomposer la commande aussi et de voir où ça merdoie ;-))
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"`à l'ancienne avec des quotes inversées.
Sinon essaye de décomposer la commande aussi et de voir où ça merdoie ;-))
Reux désolé week end oblige ^^
Bon voilà où j'en suis :
FILE="/home/maillon/vhost.test"
vhost="Ding"
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
echo "$liste"
#suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"`
echo "$suivant"
num=`(sed -n "/#-- $suivant/=" $FILE)`
echo "$num"
number=$(($num-1))
echo "$number"
echo "num -1"
Apparement j'aurai un problème avec la ligne :
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"` mais je vois pas du tout ce qui cloche (peut etre dans le (echo "$liste" && echo "$vhost") )
Apparement pour un ajout en fin de fichier (genre ZzzzAAA) il faut rajouter la condition if [ ! -z "$suivant" ] mais pas sûr...
Sinon t'aurai pas des variables d'environnement qui ferait que ça marche che toi et pas che moi ?
Bon voilà où j'en suis :
FILE="/home/maillon/vhost.test"
vhost="Ding"
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
echo "$liste"
#suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"`
echo "$suivant"
num=`(sed -n "/#-- $suivant/=" $FILE)`
echo "$num"
number=$(($num-1))
echo "$number"
echo "num -1"
Apparement j'aurai un problème avec la ligne :
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"` mais je vois pas du tout ce qui cloche (peut etre dans le (echo "$liste" && echo "$vhost") )
Apparement pour un ajout en fin de fichier (genre ZzzzAAA) il faut rajouter la condition if [ ! -z "$suivant" ] mais pas sûr...
Sinon t'aurai pas des variables d'environnement qui ferait que ça marche che toi et pas che moi ?
As-tu essayé de décomposer la commande :
Pas de caractères "zarbis" non plus dans "$liste" ou "$vhost" ???
echo "$liste" && echo "$vhost" (echo "$liste" && echo "$vhost") | sort (echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"???
Pas de caractères "zarbis" non plus dans "$liste" ou "$vhost" ???
Alors quand je décompose et que je met le résultat des commandes dans un fichier j'ai bien dans :
echo "$liste" && echo "$vhost" > ding ---> le nom du vhost apparait dans le fichier "ding"
(echo "$liste" && echo "$vhost") | sort > dong ---> liste des vhosts dans le fichier "dong" avec l'ajout au bon endroit du vhost ajouter
(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}" > dung ---> nom du vhost dans le fichier "dung" qui suit le vhost ajouter dans l'ordre alphabétique.
Par contre quand j'exécute le script complet avec l'insertion de toute les lignes concernant un vhost (DocumentRoot etc...) bah là ça fait rien.
Voilà le script que j'execute :
DIR="/home/maillon"
FILE="/home/maillon/vhosts.test"
echo "Enter the Vhost Name : (example : Test Vhost) "
read vhost
if [ -d $DIR ]
then
cd $DIR
else echo "Directory doesn't exist"
exit 0
fi
if [ -f vhosts.test ]
then
tmp=`echo $vhost | tr "A-Z" "a-z"`
doc=`echo $tmp | sed -e "s/ /_/g"`
server=`echo $tmp | sed -e "s/ /-/g"`
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"`
num=`(sed -n "/#-- $suivant/=" $FILE)`
number=$(($num-1))
if [ ! -z "$suivant" ];
then
sed '
'"$number"' i\
#############################################\
#-- '"$vhost"'\
#############################################\
<VirtualHost *>\
ServerAdmin root@domaine\
DocumentRoot /var/www/site/vhost/'"$doc"'\
ServerName '"$server"'.machine\
ServerAlias www.'"$server"'.machine '"$server"'.machine.domaine\
ErrorLog log/error_vhost-fr.log\
</VirtualHost>
' "$FILE"
echo ""
echo "OK"
echo "$liste" && echo "$vhost" > ding
(echo "$liste" && echo "$vhost") | sort > dong
(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}" > dung
fi
else
echo "File doesn't exist"
fi
echo "$liste" && echo "$vhost" > ding ---> le nom du vhost apparait dans le fichier "ding"
(echo "$liste" && echo "$vhost") | sort > dong ---> liste des vhosts dans le fichier "dong" avec l'ajout au bon endroit du vhost ajouter
(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}" > dung ---> nom du vhost dans le fichier "dung" qui suit le vhost ajouter dans l'ordre alphabétique.
Par contre quand j'exécute le script complet avec l'insertion de toute les lignes concernant un vhost (DocumentRoot etc...) bah là ça fait rien.
Voilà le script que j'execute :
DIR="/home/maillon"
FILE="/home/maillon/vhosts.test"
echo "Enter the Vhost Name : (example : Test Vhost) "
read vhost
if [ -d $DIR ]
then
cd $DIR
else echo "Directory doesn't exist"
exit 0
fi
if [ -f vhosts.test ]
then
tmp=`echo $vhost | tr "A-Z" "a-z"`
doc=`echo $tmp | sed -e "s/ /_/g"`
server=`echo $tmp | sed -e "s/ /-/g"`
liste=$(sed -n '/^#-- /{s///;p}' $FILE)
suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"`
num=`(sed -n "/#-- $suivant/=" $FILE)`
number=$(($num-1))
if [ ! -z "$suivant" ];
then
sed '
'"$number"' i\
#############################################\
#-- '"$vhost"'\
#############################################\
<VirtualHost *>\
ServerAdmin root@domaine\
DocumentRoot /var/www/site/vhost/'"$doc"'\
ServerName '"$server"'.machine\
ServerAlias www.'"$server"'.machine '"$server"'.machine.domaine\
ErrorLog log/error_vhost-fr.log\
</VirtualHost>
' "$FILE"
echo ""
echo "OK"
echo "$liste" && echo "$vhost" > ding
(echo "$liste" && echo "$vhost") | sort > dong
(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}" > dung
fi
else
echo "File doesn't exist"
fi
Ben là je sais vraiment pas où ça coince ;-((
En dernier recours essaie de rajouter des "echo" après l'initialisation de chaque variable :
En dernier recours essaie de rajouter des "echo" après l'initialisation de chaque variable :
liste=$(sed -n '/^#-- /{s///;p}' $FILE) echo "$liste" suivant=`(echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}"` echo "$suivant" num=`sed -n "/#-- $suivant/=" $FILE` # supprime les parenthèses echo "$num" number=$(($num-1)) echo "$number";-))
test: 73: Syntax error: Missing '))'
73 num=$(sed -n "/#-- $suivant/=" $FILE)
j'ai rajouter des parenthèse pour faire ça num=$((sed -n "/#-- $suivant/=" $FILE)) et après ça me dis :
test: 71: Syntax error: Missing '))'
71 suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
Essaie aussi d'exécuter ton script en mode débugage (set -xv) pour déceler d'éventuelles erreurs dans les noms de variables (interprétation)... ;-)
Voilà le script
1 #! /bin/bash
2
3 echo "1 - Add vhost- "
4 echo "2 - - "
5 echo "3 - - "
6 echo "4 - Quit - "
7 echo ""
8 echo " Select your option :"
9 read input
10
11 DIR="/home/maillon"
12 FILE="/home/maillon/vhost.test"
13
14 case "$input" in
15 1)
16 echo ""
17 echo "Enter the vhost Name : "
18 read vhost
19 ;;
20 4)
21 echo "Bye bye"
22 exit 1
23 ;;
24 *)
25 echo "Mauvais choix"
26 exit 2
27 ;;
28 esac
29
30 if [ -d $DIR ]
31 then
32 cd $DIR
33 else exit
34 fi
35
36 if [ -f vhost.test ]
37 then
38
39 ## Convert vhost Name
40 tmp=$(echo $vhost | tr "A-Z" "a-z")
41 doc=$(echo $tmp | sed -e "s/ /_/g")
42 server=$(echo $tmp | sed -e "s/ /-/g")
43
44 ## Add in vhost file
45
46 # Liste des hotes virtuels existant
47 liste=$(sed -n '/^#-- /{s///;p}' $FILE)
48 # Récupération dans la liste du nom qui suit le nouvel hôte
49 suivant=$((echo "$liste" && echo "$vhost") | sort | sed -n "/$vhost/{n;p}")
50 # Récupération du numéro de ligne dans le fichier
51 num=$(sed -n "/#-- $suivant/=" $FILE)
52 # Décrémentation du numéro
53 number=$(($num-1))
54 # L'ajout proprement dit
55 sed '
56 '"$number"' i\
57 #############################################\
58 #-- '"$vhost"'\
59 #############################################\
60 <VirtualHost *>\
61 ServerAdmin root@dmaine\
62 DocumentRoot /home/maillon/'"$doc"'\
63 ServerName '"$server"'.machine\
64 ServerAlias www.'"$server"'.machine '"$server"'.machine.domaine\
65 ErrorLog /var/log/error_vhost-fr.log\
66 </VirtualHost>
67 ' "$FILE"
68
69 echo ""
70 echo "OK"
71
72 else exit
73 fi
74
Et voilà l'erreur :
1 - Add vhost-
2 - -
3 - -
4 - Quit -
Select your option :
1
Enter the vhost Name :
Ding DOng
retest: 51: Syntax error: Missing '))'