2010-12-31 17 views
7

Ich muss ein Bash-Skript schreiben, das unter anderem alle Argumente intakt an ein anderes Programm weitergibt.

Minimal Beispiel:

 
$ 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 

Dieser naive Ansatz funktioniert nicht für Argumente mit Leerzeichen:

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

Erwartet:

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

Was soll ich in proxy.sh dafür schreiben geschehen?

Beachten Sie, dass ich keine Aliase verwenden kann, proxy.sh muss ein Skript sein - es tut einiges vor dem Aufruf script.sh.

+1

- Ist das ein Tippfehler? Was hast du gesagt? – Mehrdad

+0

"... sollte * alle seine Argumente weitergeben ..." Behoben, sorry. –

Antwort

11

Quote [email protected], es "[email protected]" machen:

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

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

Dann behält er die Originalzitate: "... sollten alle ihre Argumente intakt zu einem anderen Programm"

one a b 
two c 
three 
+0

Es funktioniert, danke. Ich habe das nicht erwartet, ich dachte, das würde alle Argumente an einen kleben ... Ich muss über die Bash-Syntax nachdenken, denke ich. –

+5

Das ist richtig. '$ @' muss immer in Anführungszeichen gesetzt werden, sonst tut es nicht das, was Sie wollen (es tut dasselbe wie '$ *' stattdessen, was normalerweise ein Fehler ist). – psmears

+3

Sie müssen auch alle anderen Variablen in "doppelte Anführungszeichen" einschließen, wenn Sie die Leerzeichen in ihnen behalten möchten. Außer in einigen seltenen Fällen schreibe also immer "$ var" 'anstelle von" $ var ". –