Dấu ngoặc kép ngăn chặn "tách từ". Đó là: chia nhỏ các biến thành nhiều mục tại các ký tự khoảng trắng (hoặc chính xác hơn là tại các khoảng trắng, tab và dòng mới như được định nghĩa trong giá trị của $IFS
biến shell mặc định ).
Ví dụ,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
Ở đây chúng ta định nghĩa howmany
hàm chỉ cho chúng ta biết có bao nhiêu tham số vị trí được đưa ra. Như bạn có thể thấy, có hai mục được truyền cho biến và với dấu ngoặc kép, văn bản trong biến được coi là một đơn vị.
Điều này rất quan trọng để truyền thông tin chính xác. Ví dụ: nếu biến chứa đường dẫn đến tệp và tên tệp chứa khoảng trắng ở bất kỳ đâu trong đường dẫn, lệnh bạn đang cố chạy có thể không thành công hoặc cho kết quả không chính xác. Nếu chúng ta cố gắng tạo một tệp có $var
biến, touch $var
sẽ tạo hai tệp, nhưng touch "$var"
chỉ một.
[ "$currentoutput" != "$lastoutput" ]
Phần của bạn cũng vậy . Thử nghiệm đặc biệt này thực hiện một so sánh trên hai chuỗi. Khi kiểm tra chạy, [
lệnh sẽ cần xem 3 đối số - một chuỗi văn bản, !=
toán tử và một chuỗi văn bản khác. Giữ dấu ngoặc kép ngăn chia tách từ và [
lệnh sẽ thấy chính xác 3 đối số đó. Bây giờ điều gì xảy ra nếu các biến không được trích dẫn?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
Ở đây, phân tách từ xảy ra, và thay vào đó [
nhìn thấy hai chuỗi hello
và world
theo sau !=
, theo sau là hai chuỗi khác hi world
. Điểm chính là không có dấu ngoặc kép, nội dung của các biến được hiểu là các đơn vị riêng biệt chứ không phải là toàn bộ một mục.
Chỉ định thay thế lệnh không yêu cầu dấu ngoặc kép như trong
var=$( df )
nơi bạn có df
đầu ra của lệnh được lưu vào var
. Tuy nhiên, đó là một thói quen tốt để luôn tăng gấp đôi các biến trích dẫn và thay thế lệnh $(...)
trừ khi bạn thực sự muốn đầu ra được coi là các mục riêng biệt.
Bên cạnh đó,
while [ true ]
một phần có thể là
while true
[
là một lệnh đánh giá các đối số của nó và [ whatever ]
luôn luôn đúng bất kể bên trong là gì. Ngược lại, while true
sử dụng lệnh true
luôn trả về trạng thái thoát thành công (và đó chính xác là những gì while
vòng lặp cần). Sự khác biệt là rõ ràng hơn một chút và thực hiện ít thử nghiệm hơn. Ngoài ra, bạn cũng có thể sử dụng :
thay vìtrue
Các trích dẫn kép echo "" date and Time
một phần có thể có thể được gỡ bỏ. Họ chỉ chèn một chuỗi trống và thêm không gian vào đầu ra. Nếu đó là mong muốn, vui lòng giữ chúng ở đó, nhưng không có giá trị chức năng cụ thể trong trường hợp này.
lsusb >> test.log
Phần này có lẽ có thể được thay thế bằng echo "$currentoutput" >> test.log
. Không có lý do để chạy lsusb
lại sau khi nó đã được chạy currentoutput=$(lsusb)
. Trong trường hợp các dòng mới
phải được bảo toàn ở đầu ra - người ta có thể thấy giá trị khi chạy lệnh nhiều lần, nhưng trong trường hợp lsusb
không cần điều đó. Càng gọi ít lệnh bên ngoài thì càng tốt, bởi vì mỗi lệnh gọi lệnh không tích hợp sẽ phát sinh chi phí CPU, sử dụng bộ nhớ và thời gian thực hiện (mặc dù các lệnh có thể được tải sẵn từ bộ nhớ).
Xem thêm:
while [ true ]
đó tạo ra một vòng lặp vô hạn, nhưng có lẽ không phải vì lý do bạn nghĩ nó xảy ra;while [ false ]
cũng tạo ra một vòng lặp vô hạn, bởi vì với một đối số duy nhất, sẽ[ ... ]
thành công nếu đối số đó là một chuỗi không trống.while true
sẽ thực sự chạy một lệnh có têntrue
(luôn luôn thành công).