2013-07-05 52 views
5

Một ví dụ:

foo() { 
    for i in ${@+"[email protected]"}; do 
     echo $i 
    done 
} 

Tôi hiểu rằng ${parameter+word} kết quả trong việc mở rộng word nếu parameter được thiết lập. Nhưng tại sao không chỉ sử dụng for i in "[email protected]"; do? Tôi chắc chắn có một số lợi ích, nhưng bất cứ ai có thể làm một ví dụ?

Cảm ơn!

+0

Tôi nghĩ (nhưng không thể xác nhận) rằng đây là một cách giải quyết đối với một số vỏ mà không xử lý một cách chính xác '$ @'. – chepner

Trả lời

5

Theo POSIX tiêu chuẩn, "[email protected]" sẽ mở rộng thành không có gì nếu [email protected] không được đặt. Tuy nhiên, Bourne shell ban đầu mở rộng nó thành một chuỗi rỗng. ${@+"[email protected]"} sẽ mở rộng thành không có gì nếu [email protected] không được đặt trong một trong hai trình bao.

Nguồn: http://www.in-ulm.de/~mascheck/various/bourne_args/

+3

Để làm rõ: cơ chế này được sử dụng là cần thiết, nhưng nó là một di tích của một kỷ nguyên bị bỏ qua. –

+0

"bị bỏ qua"? Có lẽ "đã qua". Tôi không biết tại sao tôi không chỉ nói nó đã lỗi thời. Nếu bạn đang sử dụng '/ bin/sh' trên Solaris 2.8, loại điều này vẫn có thể cần thiết, nhưng đó là vài năm tuổi. (2008?) –

+0

Cảm ơn! Điều đó xóa nó cho tôi. Đó là từ một kịch bản được sử dụng và cũ HP-UX, giải thích sự cần thiết. – Klaus

-1

khi [email protected] là một chuỗi rỗng "", ${@+"[email protected]"} sản phẩm không có gì, nhưng "[email protected]" sản xuất "", kiểm tra xem nó:

foo() { 
    for i in ${@:+"[email protected]"}; do 
     echo XXX: $i 
    done 
} 

bar() { 
    for i in "[email protected]"; do 
     echo XXX: $i 
    done 
} 

echo foo: 
foo "" 
echo bar: 
bar "" 

foo không gọi tiếng vang, nhưng bar gọi nó

+0

'foo' không gọi' echo' vì bạn đã sử dụng '$ {@: +" $ @ "}', không phải '$ {@ +" $ @ "}' (bạn đã thêm dấu hai chấm vào phần mở rộng). Bỏ qua dấu hai chấm, và 'foo' cư xử giống như thanh. – chepner

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