Shell ->Trie chaine de caractère et insertion

Maillon Messages postés 157 Statut Membre -  
Maillon Messages postés 157 Statut Membre -
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.
Configuration: Windows XP
Firefox 2.0.0.9

11 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
    1. Maillon Messages postés 157 Statut Membre 5
       
      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
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > Maillon Messages postés 157 Statut Membre
         
        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
      2. Maillon Messages postés 157 Statut Membre 5 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  2. Maillon Messages postés 157 Statut Membre 5
     
    Oki j'essaye ça dans la journée je te dis ça ^^ merci de t'être penché sur mon problème (encore ^^) ;-)
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
    1. Maillon Messages postés 157 Statut Membre 5
       
      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
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Maillon Messages postés 157 Statut Membre 5
     
    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
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  8. Maillon Messages postés 157 Statut Membre 5
     
    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
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  10. Maillon Messages postés 157 Statut Membre 5
     
    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
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  12. Maillon Messages postés 157 Statut Membre 5
     
    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