PDA

View Full Version : [BASH] stringhe composte da più variabili


massimilianonball
20-04-2013, 19:55
Ciao ragazzi, non so se è giusto scrivere qui o nella sezione x so linux :rolleyes:

Ad ogni modo il mio problema è questo: ho uno script in bash che gira su un server (ubuntu 12.04) che uso x configurare molto velocemente vlc come server di streaming; lo script mi permette di assegnare un valore a delle variabili che poi, compongono la stringa di lancio di vlc.
Per semplicità di esposizione riporto sotto la stringa:

cvlc -vvv $budget "$input" --program="$serviceID" dvb://frequency="$frequenza" :dvb-adapter="$adapter" :dvb-bandwidth="$bandwith" --sout="#transcode{vcodec=$video,fps=,vb=$bitrate,scale=$scale,$size,acodec=$audio}:"$output"" $web 2>~/Desktop/vlc.log &


Avrete notato x esempio che le variabili budget o web (e altre), NON sono scritte con le virgolette, come invece dovrebbe essere; se infatti uso nella stringa tutte le variabili virgolettate (es. "$variabile"), la stringa non va.

Se invece uso la stringa come sopra tutto funziona.. :stordita:

Sta cosa mi fa incavolare x 2 motivi:
1. non capisco xké lo script si comporti in questo modo
2. ogni volta che faccio una modifica e aggiungo/tolgo una variabile, iniziano i mal di pancia xké devo capire a quale variabile mettere/togliere le virgolette.. :muro:

Ultima stranezza:
a volte provo ad inserire TUTTA la stringa in un echo (es. echo "stringa"), x vedere cosa effettivamente mi lancia lo script: il risultato è che la stringa lanciata è LA STESSA sia mettendo le virgolette ad ogni variabile, sia assegnandole come sopra; ma solo in questo modo lo script va.. :mbe: :mbe:

:help:

kwb
21-04-2013, 14:48
Non sono un esperto di Bash ( anzi, lo odio proprio per la sua illogicità ) ma prendi questa parte di comando:

--sout="#transcode{vcodec=$video,fps=,vb=$bitrate,scale=$scale,$size,acodec=$audio}:"$output""

Usi due volte di fila " dopo $output .
Potrebbe essere quello? :stordita:

EDIT: E apri la prima " dopo --sout=

marco.r
21-04-2013, 15:24
Ciao ragazzi, non so se è giusto scrivere qui o nella sezione x so linux :rolleyes:

Ad ogni modo il mio problema è questo: ho uno script in bash che gira su un server (ubuntu 12.04) che uso x configurare molto velocemente vlc come server di streaming; lo script mi permette di assegnare un valore a delle variabili che poi, compongono la stringa di lancio di vlc.
Per semplicità di esposizione riporto sotto la stringa:

cvlc -vvv $budget "$input" --program="$serviceID" dvb://frequency="$frequenza" :dvb-adapter="$adapter" :dvb-bandwidth="$bandwith" --sout="#transcode{vcodec=$video,fps=,vb=$bitrate,scale=$scale,$size,acodec=$audio}:"$output"" $web 2>~/Desktop/vlc.log &


Avrete notato x esempio che le variabili budget o web (e altre), NON sono scritte con le virgolette, come invece dovrebbe essere; se infatti uso nella stringa tutte le variabili virgolettate (es. "$variabile"), la stringa non va.

Se invece uso la stringa come sopra tutto funziona.. :stordita:

Sta cosa mi fa incavolare x 2 motivi:
1. non capisco xké lo script si comporti in questo modo
2. ogni volta che faccio una modifica e aggiungo/tolgo una variabile, iniziano i mal di pancia xké devo capire a quale variabile mettere/togliere le virgolette.. :muro:

Ultima stranezza:
a volte provo ad inserire TUTTA la stringa in un echo (es. echo "stringa"), x vedere cosa effettivamente mi lancia lo script: il risultato è che la stringa lanciata è LA STESSA sia mettendo le virgolette ad ogni variabile, sia assegnandole come sopra; ma solo in questo modo lo script va.. :mbe: :mbe:

:help:
Da
http://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html

Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’

Ovvero tutti i caratteri tranne $ ` \ ! vengono interpretati letteralmente. In particolare lo spazio viene interpretato come parte della parola e non separatore degli argomenti. Che vuol dire ?

Vuol dire che se io scrivo

cvlc -vvv $budget "$input" --program="$serviceID"

cvlc si vede passare 4 parametri, ovvero
-vvv
il contenuto di $budget (non proprio, vedi sotto)
il contenuto di $input
--program=<il contenuto di $serviceID

Se tu scrivi invece

cvlc "-vvv $budget $input --program=$serviceID"

Il programma si vede passare un unico agomento, corrispondente alla valutazione di
-vvv $budget $input --program=$serviceID

massimilianonball
22-04-2013, 15:13
@kwb: ti sei risposto da solo :D ..cmq grazie!

Marco grazie mille x il link, non si legge mai abbastanza sull'argomento..
La tua spiegazione è stata molto valida: vedo di mettere in pratica il tutto appena possibile e subito dopo vi relaziono sul risultato, x adesso grazie!! ;)