Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572

    [bash] file di configurazione complesso

    sto scrivendo uno script e devo leggere delle variabili da un file che deve essere strutturato con questo stile:
    codice:
    [nome_1]
            descrizione= descrizione 1
            comando = comando 1
    
    [nome_2]
            descrizione= descrizione 2
            comando = comando 2
    
    ...
    (questo file di config è simile a quello di rsyncd)
    in sostanza una sorta di file config in stile xml
    posso leggere con bash un file di questo tipo?

    mi chiedevo inoltre che tipo di struttura di dati utilizzare per gestire in bash quei dati: in questo caso basterebbe un array a 2 dimensioni, ma se non sbaglio in bash ci sono solo array a 1 dimensione

    dite che posso fare tutto questo in bash o devo usare un altro linguaggio?

    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  2. #2
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    up
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  3. #3
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    ok, ho rinunciato a voler usare bash: lo sto scrivendo in C++ usando libxmlpp
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  4. #4
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570
    Originariamente inviato da Guglie
    ok, ho rinunciato a voler usare bash: lo sto scrivendo in C++ usando libxmlpp
    Utilizzando bash, 'appiattirei' l'array in questo modo:
    codice:
    #!/bin/bash
    #
    # === struttura origine, campi separati da '\n' ===
    # [nome1]
    #       descrizione=descrizione1
    #       comando=comando1
    #
    # === struttura finale, campi separati dal ':' ===
    # nome1:descrizione1:comando1
    #
    
    declare -a comandi      ### vettore per i dati
    indice=-1               ### indice per il vettore
    campo=""                ### il singolo campo
    
    while read riga; do
            ### verifico se inizia un nuovo record
            if echo "$riga" | grep -e "^\[.*\][:space:]*$" >/dev/null; then
                    ### incremento indice ed assegno il campo
                    let ++indice
                    campo=$(echo -n "$riga" | sed -e "s/^\[\(.*\)\][:space:]*$/\1/")
            else
                    ### verifico che sia una riga per le descrizioni/comandi
                    if echo "$riga" | grep -e "^[:space:]*.*[:space:]*=[:space:]*.*[:space:]*$" >/dev/null; then
                            ### assegno il campo
                            campo=$(echo -n "$riga" | sed -e "s/^[:space:]*.*[:space:]*=[:space:]*\(.*\)[:space:]*$/\1/")
                    else
                            ### ignoro spudoratamente ogni altra cosa
                            continue
                    fi
            fi
    ### aggiorno il record corrente        
    comandi[$indice]="${comandi[$indice]}${campo}:"
    done
    
    ### output per mostrare quanto è stato fatto
    for elementi in "${comandi[@]}"; do
            echo $elementi
    done
    Il test:
    codice:
    cacao74@winnie:~/tmp/bash$ cat elenco_comandi.txt
    [nome_1]
            descrizione= descrizione 1
            comando = comando 1
    
    [nome_2]
            descrizione= descrizione 2
            comando = comando 2
    
    cacao74@winnie:~/tmp/bash$ bash array.sh < elenco_comandi.txt
    nome_1: descrizione 1: comando 1:
    nome_2: descrizione 2: comando 2:
    Non so se può servirti.
    Dovendo gestire array multidimensionali, ti inviterei caldamente a *riprovarci in perl*.

    ciao
    slack? smack!

  5. #5
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    grazie per il codice
    in questo caso posso usare bash perchè mi servono soltanto array bidimensionali, che posso "simulare" come mi hai suggerito tu

    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  6. #6
    Utente di HTML.it L'avatar di M4rko
    Registrato dal
    Dec 2000
    Messaggi
    619
    Visto che la struttura del file è quella tipica dei file ini, volendo in php c'è una funzione che gestisce il tutto, restituendo un array:
    http://www.php.net/manual/it/functio...e-ini-file.php

    Poi la scelta del linguaggio dipende sempre da cosa devi fare, dalla relativa preparazione, dai gusti, dalle mode, ecc.

    Tutti hanno bisogno di credere in qualcosa.
    Io credo che mi farò un'altra birra.


  7. #7
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    Originariamente inviato da M4rko
    Visto che la struttura del file è quella tipica dei file ini, volendo in php c'è una funzione che gestisce il tutto, restituendo un array
    grazie del suggerimento, ma non posso (voglio) usare php perchè l'ho installato solo sul server
    googlando ho trovato delle classi per C++ per gestire i files ini, ma voglio provare a scrivere il programma usando solo bash (è di moda )
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  8. #8
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570
    Originariamente inviato da M4rko
    Poi la scelta del linguaggio dipende sempre da cosa devi fare, dalla relativa preparazione, dai gusti, dalle mode, ecc.
    Concordo.

    Posto comunque quello il mio esercizio in perl, visto che lo sto studiando.
    codice:
    #!/usr/bin/perl
    #
    # === struttura origine, campi separati da '\n' ===
    # [nome1]
    #       descrizione=descrizione1
    #       comando=comando1
    #
    # === struttura finale, campi separati dal ':' ===
    # x     y       valore
    # -----------------------------
    # 0     0       nome1
    # 0     1       descrizione1
    # 0     2       comando1
    #
    
    ### file sorgente da utilizzare
    $file = "/home/cacao74/tmp/perl/elenco_comandi.txt";
    
    ### apertura stream su file
    open (SORGENTE, "<$file");
    
    ### lettura sorgente
    @sorgente = <SORGENTE>;
    
    ### chisura stream su file
    close (SORGENTE);
    
    ### array comandi
    @comandi = ();
    $idx = -1;
    $idy = -1;
    
    ### creazione matrice dati
    foreach $riga (@sorgente) {
            if ($riga =~ m/^\[.*\][[:space:]]*$/) {
                    $idy = -1;
                    $comandi[++$idx] = ();
                    $riga =~ s/^\[(.*)\][[:space:]]*$/$1/;
                    $comandi[$idx][++$idy] = $riga;
            } elsif ($riga =~ m/^[[:space:]]*.*[[:space:]]*=[[:space:]]*.*[[:space:]]*$/) {
                    $riga =~ s/^[[:space:]]*.*[[:space:]]*=[[:space:]]*(.*)[[:space:]]*$/$1/;
                    $comandi[$idx][++$idy] = $riga;
            }
    }
    
    ### output per mostrare cosa si è fatto
    foreach $record (@comandi) {
            print "@{$record}\n";
            print "Lo stesso record mostrato verticalmente:\n";
            for ($i = 0; $i < @{$record}; $i++) {
                    print "\t$record->[$i]\n";
            }
    }
    Il test:
    codice:
    cacao74@winnie:~/tmp/perl$ perl -c array.pl
    array.pl syntax OK
    
    cacao74@winnie:~/tmp/perl$ perl -w array.pl
    nome_1 descrizione 1 comando 1
    Lo stesso record mostrato verticalmente:
            nome_1
            descrizione 1
            comando 1
    nome_2 descrizione 2 comando 2
    Lo stesso record mostrato verticalmente:
            nome_2
            descrizione 2
            comando 2

    ciao
    slack? smack!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.