Pagina 1 di 1

bash - variabili dinamiche [RISOLTO]

Inviato: dom 17 gen 2010, 14:19
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!!! :)

Re: bash - variabili dinamiche

Inviato: dom 17 gen 2010, 14:30
da 414N

Codice: Seleziona tutto

case "$1" in
rock)
  mpg321 "$rock"
  ;;
classica)
  mpg321 "$classica"
  ;;
new_age)
  mpg321 "$new_age"
  ;;
esac
quick and dirty ;)

Re: bash - variabili dinamiche

Inviato: dom 17 gen 2010, 14:36
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"

Re: bash - variabili dinamiche

Inviato: dom 17 gen 2010, 15:16
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 :)

Re: bash - variabili dinamiche

Inviato: dom 17 gen 2010, 16:55
da targzeta
Usa:

Codice: Seleziona tutto

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

Emanuele

Re: bash - variabili dinamiche

Inviato: dom 17 gen 2010, 18:47
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 ;)

Re: bash - variabili dinamiche [RISOLTO]

Inviato: dom 17 gen 2010, 19:01
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