2012-03-28 77 views
20

thể trùng lặp:
What the difference between “[email protected]” and “$*” in bash?

Trong nhiều năm qua và trên hàng chục lần, tôi đã do dự giữa việc sử dụng $*[email protected] trong kịch bản shell . Sau khi đọc phần áp dụng của manpage của Bash nhiều lần, đã thử cả hai $*[email protected], tôi ít nhiều hoàn toàn không hiểu được sự khác biệt thực tế của ứng dụng giữa hai biến. Bạn có thể khai sáng cho tôi được không?

Gần đây tôi đã sử dụng $* nhưng không hỏi tôi lý do. Tôi không biết tại sao, bởi vì tôi không biết tại sao [email protected] thậm chí còn tồn tại, ngoại trừ một từ đồng nghĩa gần như chính xác cho $*.

Có sự khác biệt thực tế nào không?

(.. Cá nhân tôi có xu hướng sử dụng Bash, nhưng vẫn bất khả tri về việc lựa chọn vỏ Câu hỏi của tôi là không cụ thể cho Bash như xa như tôi biết)

+1

Tìm kiếm [$ * $ @] (http://symbolhound.com/?q=%24%40+%24*) trên SymbolHound tìm số bản sao. Công cụ tiện dụng, đó. –

+1

(Ngoài ra, ví dụ: http://stackoverflow.com/questions/3307672/whats-the-difference-between-and-in-unix, http://stackoverflow.com/questions/2761723/what-is-the -difference-between-and-in-shell-scripts, http://stackoverflow.com/questions/4491115/what-is-the-internal-processing-of-and.) –

+0

@ChrisMorgan: Đã xác nhận tất cả các điểm. SymbolHound trông có vẻ tiện dụng. Tôi đã không biết về nó. Lần tới, tôi sẽ tìm kiếm ở đó trước. Tôi có nên thực hiện một số hành động để hợp nhất câu hỏi của tôi với câu hỏi mà bạn đề xuất không? – thb

Trả lời

46

Không được bỏ phiếu, không có sự khác biệt - chúng được mở rộng đến tất cả các đối số và chúng được phân tách cho phù hợp. Sự khác biệt xuất hiện khi trích dẫn. "[email protected]" mở rộng đến các đối số được trích dẫn chính xác và "$*" làm cho tất cả đối số thành một đối số duy nhất. Thực hiện việc này ví dụ:

#!/bin/bash 

function print_args_at { 
    printf "%s\n" "[email protected]" 
} 

function print_args_star { 
    printf "%s\n" "$*" 
} 

print_args_at "one" "two three" "four" 
print_args_star "one" "two three" "four" 

Sau đó:

$ ./printf.sh 

one 
two three 
four 

one two three four 
5

xem xét:

foo() { mv "[email protected]"; } 
bar() { mv "$*"; } 
foo a b 
bar a b 

Cuộc gọi để foo sẽ cố gắng để tập tin mv a đến b. Cuộc gọi đến thanh sẽ thất bại vì nó gọi mv chỉ với một đối số.

+0

Cảm ơn bạn. Có phải * $ @ * và * $ \ ** sau đó giống hệt nhau nếu được sử dụng không có dấu ngoặc kép? – thb

+3

Không có dấu ngoặc kép, $ @ và $ * giống hệt nhau. –

+2

Ngoài ra, trên một số vỏ bị hỏng '" $ @ "' mở rộng thành đối số trống '" "' nếu không có tham số vị trí, thay vì mở rộng chính xác thành không có gì.Vì vậy, thủ thuật này phải được sử dụng: '$ {@ +" $ @ "}' (nếu '$ @' là không trống, thay thế '" $ @ "' không có gì khác). Nếu bạn đã từng thấy điều đó, bạn sẽ biết tại sao. – Kaz

4

Cũng lưu ý rằng "[email protected]" là kỳ diệu chỉ khi không có gì khác trong dấu ngoặc kép. Chúng giống hệt nhau:

set -- a "b c" d 
some_func "foo $*" 
some_func "foo [email protected]" 

Trong cả hai trường hợp, some_func nhận được một đối số.

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