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
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
A voir également:
- Shell ->Trie chaine de caractère et insertion
- Caractère ascii - Guide
- Caractere speciaux - Guide
- Caractère spéciaux - Guide
- Chaine tnt gratuite sur mobile - Guide
- Insertion liste déroulante excel - Guide
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
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
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.
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
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 ^^) ;-)
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
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.
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
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
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
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
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).
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
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 ?
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 ?
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
16 nov. 2007 à 18:28
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 ;-))
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
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 ?
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 ?
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
19 nov. 2007 à 18:36
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" ???
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
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
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
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
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 :
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";-))
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
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....
Je vais raccourcirs le sed pour voir si il est pris en compte quand même....
16 nov. 2007 à 14:54
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}")
16 nov. 2007 à 15:10
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)... ;-)
16 nov. 2007 à 15:19
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 '))'