Shell ->Trie chaine de caractère et insertion

Fermé
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 - 15 nov. 2007 à 13:52
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 - 27 nov. 2007 à 09:12
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.
A voir également:

11 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
15 nov. 2007 à 20:18
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
#! /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
fi

L'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.

0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
16 nov. 2007 à 14:54
Erreur de synthaxe à la ligne :
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}")
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011
16 nov. 2007 à 15:10
Affiche ton script en entier. Je viens de re-tester chez moi et ça marche nickel ;-\
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)...
$ cat plop
#############################################
#-- Albert
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/$albert
 ServerName albert.machine
 ServerAlias www.albert.machine albert.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- Firmin
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/firmin
 ServerName firmin.machine
 ServerAlias www.firmin.machine firmin.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- Toto
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/toto
 ServerName toto.machine
 ServerAlias www.toto.machine toto.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- zzz
#############################################

$ ./foo.sh
1 - Add vhost-
2 - -
3 - -
4 - Quit -

 Select your option :
1

Enter the vhost Name :
Julie
#############################################
#-- Albert
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/$albert
 ServerName albert.machine
 ServerAlias www.albert.machine albert.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- Firmin
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/firmin
 ServerName firmin.machine
 ServerAlias www.firmin.machine firmin.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- Julie
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/julie
 ServerName julie.machine
 ServerAlias www.julie.machine julie.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- Toto
#############################################
<VirtualHost *>
 ServerAdmin root@dmaine
 DocumentRoot /var/www/site/vhost/toto
 ServerName toto.machine
 ServerAlias www.toto.machine toto.machine.domaine
 ErrorLog log/error_vhost-fr.log
</VirtualHost>
#############################################
#-- zzz
#############################################

OK
;-)
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
16 nov. 2007 à 15:19
J'ai fais un copier coller de ton script pour voir dans un premier temps et ça me met l'erreur de synthaxe :s

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 '))'
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
16 nov. 2007 à 11:53
Oki j'essaye ça dans la journée je te dis ça ^^ merci de t'être penché sur mon problème (encore ^^) ;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 nov. 2007 à 15:55
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.
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
16 nov. 2007 à 16:40
J'ai coller ce que tu m'a dis dans un nouveau fichier et voici le résultat :
Bureau
Maison
Tele

essai: 7: Syntax error: Missing '))'

Il parcours bien le fichiers et affiche bien les vhost qui sont dedans (dans l'ordre alphabétique) mais ya une erreur à la fin... :s
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 nov. 2007 à 16:51
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).
0

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

Posez votre question
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
16 nov. 2007 à 17:12
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 ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
16 nov. 2007 à 18:28
Essaie d'écrire la commande comme ça alors :
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 ;-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
19 nov. 2007 à 18:31
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 ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
19 nov. 2007 à 18:36
As-tu essayé de décomposer la commande :
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" ???
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
20 nov. 2007 à 11:22
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
20 nov. 2007 à 11:35
Ben là je sais vraiment pas où ça coince ;-((

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"
;-))
0
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 5
27 nov. 2007 à 09:12
Oué j'ai essayé ligne par ligne (en mettant le résultat dans un fichier temporaire différent à chaque fois) et ça marche bien mais par contre quand après je fais le sed bah la ... plus rien il ne fait rien :s

Je vais raccourcirs le sed pour voir si il est pris en compte quand même....
0