2010-12-31 23 views
7

Tôi cần viết một tập lệnh bash, trong số những thứ khác, nên chuyển tất cả các đối số của nó còn nguyên vẹn cho một chương trình khác.

dụ tối thiểu:

 
$ 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 

cách tiếp cận ngây thơ này không làm việc cho các đối số với không gian:

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

dự kiến:

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

tôi nên viết gì trong proxy.sh cho điều này để xảy ra?

Lưu ý rằng tôi không thể sử dụng bí danh, proxy.sh phải là tập lệnh - một số nội dung trước khi gọi script.sh.

+1

- đó là một lỗi đánh máy? Bạn muốn nói gì? – Mehrdad

+0

"... nên * vượt qua * tất cả các đối số của nó ..." Cố định, xin lỗi. –

Trả lời

11

Trích [email protected], làm cho nó "[email protected]":

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

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

Sau đó, nó vẫn giữ được trích dẫn ban đầu: "... nên tất cả các đối số của nó còn nguyên vẹn đến một chương trình khác"

one a b 
two c 
three 
+0

Nó hoạt động, cảm ơn. Tôi không ngờ rằng, tôi nghĩ rằng điều này sẽ dính tất cả các đối số vào một ... Cần phải đọc lên cú pháp Bash, tôi đoán vậy. –

+5

Điều này là chính xác. '$ @' luôn luôn phải được trích dẫn, nếu không nó sẽ không làm những gì bạn muốn (nó cũng giống như '$ *' thay vào đó, thường là một lỗi). – psmears

+3

Bạn cũng phải đính kèm tất cả các biến khác trong "dấu ngoặc kép" nếu bạn muốn giữ khoảng trống trong chúng. Ngoại trừ trong một số ít trường hợp, do đó, luôn luôn viết '" $ var "' thay vì '$ var'. –

Các vấn đề liên quan