bash - variabili dinamiche [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

bash - variabili dinamiche [RISOLTO]

Messaggio da danix »

non so bene come chiamare questo thread, spero che il titolo che ho dato non sia ingannevole, nel caso, mi scuso fin d'ora...
Il problema in cui sono incappato è il seguente:

In una directory ho creato 3 liste di files con find e le ho chiamate classica, rock e new_age. Le voglio dare in pasto a mpg321 in modo che riproduca i files che ci sono in quelle liste, e fin qui non ho problemi.

Adesso sto scrivendo lo script che deve lanciare mpg321 con gli argomenti corretti in base alla lista che voglio far suonare.
Lo script sarà lanciato con un unico argomento che sarà il nome della playlist che voglio suonare, ad esempio lo lancerò con:

Codice: Seleziona tutto

mioscript.sh rock
per far suonare la playlist rock.txt.
In questo script tramite una funzione salvo in 3 variabili le 3 playlist in questo modo:

Codice: Seleziona tutto

rock=/percorso/di/rock.txt
classica=/percorso/di/classica.txt
new_age=/percorso/di/new_age.txt
Grazie alla funzione che ho scritto ogni volta che lancio lo script vado a controllare se ci sono altre playlist e le importo allo stesso modo...

Il problema sorge nel momento in cui provo a lanciare mpg321 dandogli come argomento $1 in quanto la bash mi darà il valore di $1 e quindi "rock", invece io vorrei che mi desse il valore della variabile corrispondente ad $1... come faccio??

Questo è lo script:

Codice: Seleziona tutto

#! /bin/bash

E_NOPLAYLISTARG=71
E_PLAYLISTFILE_NOT_AVAILABLE=72
E_WRONGPLAYLIST=73

PLAYLISTDIR=/home/media/musica/playlists
PLAYLISTFILE=/home/danix/.myp3player/playlists.txt



show_playlists () {
        for LIST in ${PLAYLISTDIR}/* ;do
                basename $LIST |cut -d '.' -f 1
        done
}

create_playlistfile () {
        if [[ -f $PLAYLISTFILE || -s $PLAYLISTFILE ]];then
                rm -f $PLAYLISTFILE
        fi
        for LIST in ${PLAYLISTDIR}/* ;do
                echo $(basename $LIST |cut -d '.' -f 1)=$LIST >> $PLAYLISTFILE
        done
        source $PLAYLISTFILE
}

create_playlistfile

if [ -z $1 ];then
        echo "Non so quale playlist riprodurre."
        echo "Questa è la lista delle playlist disponibili"
        show_playlists
        exit $E_NOPLAYLISTARG
else
        grep $1 $PLAYLISTFILE &> /dev/null
        if [ $? -eq 0 ];then
#               while true; do
#                       mpg321 -Z --list $1
#               done
                echo $1
        else
                echo "La playlist richiesta è inesistente"
                exit $E_WRONGPLAYLIST
        fi
fi

Chi mi da una mano??
Grazie mille a tutti in anticipo!!! :)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: bash - variabili dinamiche

Messaggio da 414N »

Codice: Seleziona tutto

case "$1" in
rock)
  mpg321 "$rock"
  ;;
classica)
  mpg321 "$classica"
  ;;
new_age)
  mpg321 "$new_age"
  ;;
esac
quick and dirty ;)
Ultima modifica di 414N il dom 17 gen 2010, 14:40, modificato 1 volta in totale.

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash - variabili dinamiche

Messaggio da conraid »

Se veramente i file sono sempre come hai messo nell'esempio puoi mettere
/percorso/di/${1}.txt

altrimenti giochi con "if-else" o "case"

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: bash - variabili dinamiche

Messaggio da danix »

cercavo una soluzione in cui si potesse richiamare il contenuto di una variabile tramite il contenuto di un'altra passata a runtime... siccome mi sa che sono abbondantemente oltre le mie capacità ho risolto con la soluzione
/percorso/di/${1}.txt

Grazie a tutti per l'aiuto, comunque se vi vengono in mente altre cose io ad imparare non mi tiro indietro :)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: bash - variabili dinamiche

Messaggio da targzeta »

Usa:

Codice: Seleziona tutto

${!1}
Nel manuale viene chiamato come "indirect expansion", generalmente invece viene conosciuto come "variable variables".

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
danix
Staff
Staff
Messaggi: 3287
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 5.4.43 x86_64
Desktop: i3
Località: Siderno (RC)
Contatta:

Re: bash - variabili dinamiche

Messaggio da danix »

MI TI COOO!!! Grande Spina, era esattamente quello che cercavo, anche se nel man bash l'ho trovato sotto l'espansione di parametro e non come "indirect expansion" di cui non sono riuscito a trovare traccia...

Ancora grazie a tutti ;)
danix
myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6631
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: bash - variabili dinamiche [RISOLTO]

Messaggio da targzeta »

Non sono sulla mia slackware e sono collegato via ssh al server di facoltà:

Codice: Seleziona tutto

$> bash --version
GNU bash, version 3.1.14(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
quindi

Codice: Seleziona tutto

$> man bash
....
If the first character of parameter is an exclamation point, a level of
variable  indirection  is introduced.  Bash uses the value of the vari-
able formed from the rest of parameter as the  name  of  the  variable;
this  variable  is  then expanded and that value is used in the rest of
the substitution, rather than the value of parameter itself.   This  is
known as indirect expansion.  The exceptions to this are the expansions
of ${!prefix*} and ${!name[@]} described below.  The exclamation  point
must  immediately  follow the left brace in order to introduce indirec-
tion.
...
Ovviamente è sotto l'espansione di parametro.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi