Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

aiutino bash script

1 view
Skip to first unread message

Piviul

unread,
May 24, 2012, 1:00:01 AM5/24/12
to
Ciao a tutti avrei bisogno in uno script bash di inserire in una
variabile un comando, parametri inclusi. Il problema è che i parametri
possono contenere spazi quindi qualcosa come

function myfunc
{
echo $1
}
cmd="myfunc \"param 1\""
$cmd

Non ha il comportamento desiderato (in $1 di myfunc ho infatti "param
non "param 1").

In questi casi come si fa in bash?

Grazie

Piviul


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDBEDD...@riminilug.it

MaX

unread,
May 24, 2012, 3:20:02 AM5/24/12
to
il problema sta nel'uso non corretto di $1.

prova con

function myfunc
{
echo $1 $2
}
cmd="myfunc param 1""
$cmd

ciao
MaX

Il 24/05/12, Piviul<piv...@riminilug.it> ha scritto:
--
ciao,
MaX


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/CAEyAVmuqHkENx_VYQDVRrY12...@mail.gmail.com

Paolo Sala

unread,
May 24, 2012, 3:20:02 AM5/24/12
to
MaX scrisse in data 24/05/2012 09:12:
> il problema sta nel'uso non corretto di $1.
>
non è proprio così: la funzione si aspetta che nel primo parametro ci
sia una parola che potrebbe contenere anche spazi. Vorrei gestire in una
variabile una chiamata tipo:

myfunc "param 1"

Non c'è quindi un modo?

Piviul


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDE0F8...@riminilug.it

Giuseppe Sacco

unread,
May 24, 2012, 3:30:02 AM5/24/12
to
Il giorno gio, 24/05/2012 alle 09.19 +0200, Paolo Sala ha scritto:
> MaX scrisse in data 24/05/2012 09:12:
> > il problema sta nel'uso non corretto di $1.
> >
> non è proprio così: la funzione si aspetta che nel primo parametro ci
> sia una parola che potrebbe contenere anche spazi. Vorrei gestire in una
> variabile una chiamata tipo:

Puoi usare $*. Ad esempio questa è scritta in posix, senza la sintassi
bash:

myfunc()
{
tutti="$*"
echo $tutti
}
cmd="myfunc param1 param2 param3"
$cmd

Ciao,
G.


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/1337844180.6002.53.camel@scarafaggio

MaX

unread,
May 24, 2012, 4:00:01 AM5/24/12
to
No, il problema sta proprio in $1, ed è incorretto perché bash usa
questa variabile per sapere quanti parametri deve passare allo script.
Tu la stai usando al contrario.

prova questo script dal nome prova.sh:
-------------
#!/bin/bash

echo $1

-------

e lancialo con

# ./prova.sh par1 par2

la risposta sará: par1

Non saprei ora se c'è una soluzione, al limite potresti fare una
funzione che analizza il numero di spazi dei parametri e aggiunge alla
funzione un numero uguale di variabili $2 $3 $4...

ciao
MaX

Il 24/05/12, Paolo Sala<piv...@riminilug.it> ha scritto:
--
ciao,
MaX


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/CAEyAVmsz9uBkHyg6HxByz4sh...@mail.gmail.com

Piviul

unread,
May 24, 2012, 4:00:02 AM5/24/12
to
Giuseppe Sacco scrisse in data 24/05/2012 09:23:
> Puoi usare $*.
è incredibilmente davvero difficile spiegarsi... non sono alla ricerca
di un workaround. La funzione che vorrei chiamare da uno script accetta
parametri differenti in particolare se siete curiosi devo fare una
chiamata a dar; i percorsi che devo passare a dar ad esempio con
l'opzione -R oppure -c oppure... possono contenere spazi. Mi farebbe
comodo, molto comodo nello script mettere la chiamata a dar in una
variabile: è possibile che non ci sia il modo per passare correttamente
un parametro che può contenere spazi a una funzione?

Grazie lo stesso

Piviul

PS
Giuseppe, scusa il messaggio in privato


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDE880...@riminilug.it

Giuseppe Sacco

unread,
May 24, 2012, 4:30:02 AM5/24/12
to
Il giorno gio, 24/05/2012 alle 09.51 +0200, Piviul ha scritto:
> Giuseppe Sacco scrisse in data 24/05/2012 09:23:
> > Puoi usare $*.
> è incredibilmente davvero difficile spiegarsi... non sono alla ricerca
> di un workaround. La funzione che vorrei chiamare da uno script accetta
[...]

Per quanto io ne sappia non puoi ricostruire gli argomenti una volta che
metti tutto in una stringa (cmd) a meno che non utilizzi «eval». Ad
esempio:

#!/bin/dash
myfunc()
{
tutti="$*"
echo $tutti
}

myfuncB()
{
echo $1
}

echo Tramite stringa
cmd="myfunc param1 param2 param3"
$cmd

echo Senza stringa
myfuncB "par- -am1" param2
echo Tramite stringa con eval
cmd="myfuncB \"par- -am1\" param2"
eval $cmd

In questo caso, nella seconda e terza invocazione, tutto funziona come
vorresti. Giusto?

Ciao,
G.


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/1337847888.6002.57.camel@scarafaggio

Piviul

unread,
May 24, 2012, 4:30:02 AM5/24/12
to
MaX scrisse in data 24/05/2012 09:59:
> No, il problema sta proprio in $1, ed è incorretto perché bash usa
> questa variabile per sapere quanti parametri deve passare allo script.
> Tu la stai usando al contrario.
>
> prova questo script dal nome prova.sh:
> -------------
> #!/bin/bash
>
> echo $1
>
> -------
>
> e lancialo con
>
> # ./prova.sh par1 par2
>
Prova ad eseguire questo codice:
param1="primo parametro"; ./prova.sh "$param1"

Come vedi funziona tutto a dovere. Ora però se volessi traspotare questa
chiamata in una variabile, qualcosa tipo:
param1="parametro1";cmd="./prova.sh $param1"; $cmd

funziona ma se invece in param1 ci sono spazi non funziona più. Come
posso fare per fare in modo che funzioni lo stesso? ...mi sembra
impossibile ch enon si possa fare!

Grazie mille comunque a tutti quanti

Piviul


Infatti la chiamata che dovrei fare è ./prova.sh "primo parametro";
normalmente infatti se voglio passare un parametro che può contenere
spazi si usano le virgolette; ma se invece la chiamata alla funzione



--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDF0A9...@riminilug.it

Alessandro T.

unread,
May 24, 2012, 4:40:02 AM5/24/12
to
Il 24/05/2012 09:51, Piviul ha scritto:
> è possibile che non ci sia il modo per passare correttamente un
> parametro che può contenere spazi a una funzione?

Non son sicurissimo di aver capito ma:

$ function a(){ echo $1;}
$ a primo secondo
primo
$ a primo\ secondo
primo secondo
$ a 'primo secondo'
primo secondo

Tieni presente che bash individua i parametri grazie agli spazi; quindi
o modifichi questo comportamento o usi gli escape o forzi la stringa.

--
Alessandro T.

R: Perché leggiamo dall'alto al basso e da sinistra a destra.
D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato?


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDEF7E...@yahoo.it

Piviul

unread,
May 24, 2012, 5:20:02 AM5/24/12
to
Giuseppe Sacco scrisse in data 24/05/2012 10:24:
> In questo caso, nella seconda e terza invocazione, tutto funziona come
> vorresti. Giusto?
>
ESATTO! Grande Giuseppe, mille grazie! ...non avevo pensato ad eval!!!

Grazie ancora

Piviul


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/4FBDFC83...@riminilug.it

MaX

unread,
May 24, 2012, 5:40:02 AM5/24/12
to
buono a sapersi. Grazie anche da parte mia :D

Il 24/05/12, Piviul<piv...@riminilug.it> ha scritto:
--
ciao,
MaX


--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org

To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
Archive: http://lists.debian.org/CAEyAVmsr+M6=EEz5-uZHPQBwF1ZGWKP...@mail.gmail.com
0 new messages