2016-05-10 21 views
6

Có sự khác biệt nào giữa [email protected]"[email protected]" không?

Tôi hiểu rằng có thể có sự khác biệt đối với các ký tự không phải đặc biệt, nhưng còn dấu hiệu @ với đối số nhập liệu thì sao?

+1

Câu hỏi không phải là bản sao nghiêm ngặt, nhưng câu trả lời cũng trả lời câu hỏi này. –

Trả lời

9

Có!

$ cat a.sh 
echo "[email protected]" 
echo [email protected] 

Hãy chạy nó:

$ ./a.sh 2 "3  4" 5 
2 3  4 5     # output for "[email protected]" 
2 3 4 5      # output for [email protected] -> spaces are lost! 

Như bạn thấy, sử dụng [email protected] làm cho các thông số để "mất" một số nội dung khi được sử dụng như một tham số. Xem ví dụ- I just assigned a variable, but echo $variable shows something else để có giải thích chi tiết về điều này.


Từ GNU Bash manual --> 3.4.2 Special Parameters:

@

($ @) Mở rộng đến các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong dấu ngoặc kép, mỗi thông số mở rộng thành từ riêng biệt. Tức là, "$ @" tương đương với "$ 1" "$ 2" .... Nếu mở rộng ngoặc kép được mở rộng trong một từ, thì việc mở rộng tham số đầu tiên của được kết hợp với phần bắt đầu của từ gốc và việc mở rộng thông số cuối cùng được kết hợp với phần cuối cùng của từ gốc. Khi không có tham số vị trí, "$ @" và $ @ mở rộng thành không có gì (nghĩa là chúng bị xóa).

5

Truyền $ @ cho lệnh chuyển tất cả các đối số cho lệnh. Nếu một đối số chứa một dấu cách, lệnh sẽ thấy đối số đó là hai đối số riêng biệt.

Chuyển "$ @" cho lệnh chuyển tất cả đối số dưới dạng chuỗi được trích dẫn đến lệnh. Lệnh này sẽ thấy một đối số chứa khoảng trắng là một đối số chứa khoảng trắng.

Để dễ dàng hình dung sự khác biệt viết một hàm in tất cả các đối số của nó trong vòng một, cùng một lúc:

#!/bin/bash 

loop_print() { 
    while [[ $# -gt 0 ]]; do 
     echo "argument: '$1'" 
     shift 
    done 
} 

echo "#### testing with \[email protected] ####" 
loop_print [email protected] 
echo "#### testing with \"\[email protected]\" ####" 
loop_print "[email protected]" 

Calling rằng kịch bản với

<script> "foo bar" 

sẽ sản xuất sản lượng

#### testing with [email protected] #### 
argument: 'foo' 
argument: 'bar' 
#### testing with "[email protected]" #### 
argument: 'foo bar' 
Các vấn đề liên quan