Bạn luôn cần các trích dẫn xung quanh các biến trong tất cả các bối cảnh danh sách , đó là ở mọi nơi, biến có thể được mở rộng thành nhiều giá trị trừ khi bạn muốn 3 tác dụng phụ của việc không để lại một biến.
danh sách bối cảnh bao gồm các đối số cho các lệnh đơn giản như [
hoặc echo
, các for i in <here>
phép gán cho mảng ... Có các bối cảnh khác trong đó các biến cũng cần được trích dẫn. Tốt nhất là luôn luôn trích dẫn các biến trừ khi bạn có lý do rất chính đáng để không.
Hãy nghĩ về sự vắng mặt của dấu ngoặc kép (trong ngữ cảnh danh sách) là toán tử split + global .
Như thể echo $test
là echo glob(split("$test"))
.
Hành vi shell gây nhầm lẫn cho hầu hết mọi người bởi vì trong hầu hết các ngôn ngữ khác, bạn đặt dấu ngoặc kép quanh các chuỗi cố định, như puts("foo")
, chứ không phải xung quanh các biến (như puts(var)
) trong khi vỏ lại theo cách khác: mọi thứ đều là chuỗi, vì vậy hãy đặt dấu ngoặc kép xung quanh mọi thứ sẽ là cồng kềnh, bạn echo test
, bạn không cần "echo" "test"
. Trong shell, dấu ngoặc kép được sử dụng cho mục đích khác: ngăn chặn một số ý nghĩa đặc biệt của một số ký tự và / hoặc ảnh hưởng đến hành vi của một số mở rộng.
Trong [ -n $test ]
hoặc echo $test
, shell sẽ phân tách $test
(theo khoảng trống theo mặc định) và sau đó thực hiện việc tạo tên tệp (mở rộng tất cả các mẫu *
, '?' ... vào danh sách các tệp phù hợp), sau đó chuyển danh sách đối số đó cho các lệnh [
hoặc echo
lệnh .
Một lần nữa, hãy nghĩ về nó như "[" "-n" glob(split("$test")) "]"
. Nếu $test
là trống hoặc chỉ chứa khoảng trống (SPC, tab, nl), sau đó các nhà điều hành phân chia + glob sẽ trả về một danh sách trống, vì vậy [ -n $test ]
sẽ "[" "-n" "]"
, đó là một thử nghiệm để kiểm tra wheter "-n" là chuỗi rỗng hay không. Nhưng hãy tưởng tượng những gì sẽ xảy ra nếu $test
là "*" hoặc "= foo" ...
Trong [ -n "$test" ]
, [
được thông qua bốn đối số "["
, "-n"
, ""
và "]"
(không có dấu ngoặc kép), đó là những gì chúng ta muốn.
Cho dù đó là echo
hoặc [
không có sự khác biệt, chỉ là nó tạo echo
ra điều tương tự cho dù nó có thông qua một đối số trống hay không có đối số nào.
Xem thêm câu trả lời này cho một câu hỏi tương tự để biết thêm chi tiết về [
lệnh và [[...]]
cấu trúc.
echo
, các khoảng trắng và dòng mới sẽ bị xóa.