2010-12-31 4 views
7

Potrzebuję napisać skrypt bash, który między innymi powinien przekazać wszystkie swoje argumenty w stanie nienaruszonym do innego programu.

Minimal przykład:

 
$ cat >proxy.sh 
#!/bin/bash 

./script.sh [email protected] 
^D 

$ chmod +x proxy.sh 

$ cat >script.sh 
#!/bin/bash 

echo one $1 
echo two $2 
echo three $3 
^D 

$ chmod +x script.sh 

to naiwne podejście nie działa dla argumentów ze spacjami:

 
$ ./proxy.sh "a b" c 
one a 
two b 
three c 

Oczekiwany:

 
$ ./proxy.sh "a b" c 
one a b 
two c 
three 

Co powinienem napisać w proxy.sh do tego, aby zdarzyć?

Zauważ, że nie mogę używać aliasów, proxy.sh musi być skryptem - robi pewne rzeczy przed wywołaniem script.sh.

+1

- czy to literówka? Co miałeś na myśli? – Mehrdad

+0

"... powinien * przekazać * wszystkie swoje argumenty ..." Naprawiono, przepraszam. –

Odpowiedz

11

Cytat [email protected], co czyni go "[email protected]":

$ cat >proxy.sh 
#!/bin/bash 

./script.sh "[email protected]" 
^D 

Następnie zachowuje oryginalne cytaty: "... Czy wszystkie swoje argumenty nienaruszone do innego programu"

one a b 
two c 
three 
+0

Działa, dzięki. Nie spodziewałem się tego, myślałem, że to sklei wszystkie argumenty do jednego ... Myślę, że muszę przeczytać składnię Basha. –

+5

To jest poprawne. '$ @' musi zawsze być cytowane, albo nie robi tego, co chcesz (zamiast tego robi to samo co '$ *', co zwykle jest błędem). – psmears

+3

Musisz również ująć wszystkie inne zmienne w "podwójne cudzysłowy", jeśli chcesz zachować spacje w nich. Poza kilkoma rzadkimi przypadkami, zawsze napisz '' $ var "' zamiast '$ var'. –