Cú pháp là dấu hiệu cấp, vì vậy ý nghĩa của các ký hiệu đô la phụ thuộc vào dấu hiệu đó là trong Biểu thức $(command)
là một từ đồng nghĩa hiện đại cho `command`
viết tắt để thay thế lệnh. nó có nghĩa là, chạy command
và đặt đầu ra của nó ở đây.Vì vậy,
echo "Today is $(date). A fine day."
sẽ chạy lệnh date
và bao gồm sản lượng của nó trong đối số để echo
. Các dấu ngoặc đơn không liên quan đến cú pháp để chạy một lệnh trong một subshell, mặc dù chúng có một điểm chung (sự thay thế lệnh cũng chạy trong một subshell riêng biệt).
Ngược lại, ${variable}
chỉ là một cơ chế định hướng, vì vậy bạn có thể nói ${var}text
khi bạn có ý nghĩa, nội dung của biến var
, tiếp theo là text
(như trái ngược với $vartext
điều đó có nghĩa, nội dung của biến vartext
).
Vòng lặp while
dự kiến một đối số sẽ đánh giá đúng hoặc sai (hoặc thực sự nhiều, nơi giá trị chân lý cuối cùng được kiểm tra - cảm ơn Jonathan Leffler đã chỉ ra điều này); khi nó sai, vòng lặp không còn được thực thi nữa. Vòng lặp for
lặp qua danh sách các mục và liên kết từng biến thành một biến vòng lặp; cú pháp mà bạn tham chiếu là một cách tổng quát - cách để biểu diễn vòng lặp trên một loạt các giá trị số học.
Vòng lặp for
giống như vậy có thể được lặp lại dưới dạng vòng lặp while
. Khái niệm
for ((init; check; step)); do
body
done
tương đương với
init
while check; do
body
step
done
Nó làm cho tinh thần để giữ tất cả các kiểm soát vòng lặp ở một nơi cho mức độ dễ đọc; nhưng như bạn có thể thấy khi nó được thể hiện như thế này, vòng lặp for
thực hiện khá nhiều hơn một chút so với vòng lặp while
.
Tất nhiên, cú pháp này là đặc thù của Bash; cổ điển Bourne shell chỉ có
for variable in token1 token2 ...; do
(Hơi thanh lịch hơn, bạn có thể tránh được echo
trong ví dụ đầu tiên miễn là bạn có chắc chuỗi lập luận của bạn không chứa bất kỳ mã định dạng %
:
date +'Today is %c. A fine day.'
Tránh một quá trình mà bạn có thể là một yếu tố quan trọng để tìm hiểu, mặc dù nó không kiếm được nhiều sự khác biệt trong ví dụ bị cô lập này.)
Nghiêm ngặt, lệnh 'while' dự kiến một chuỗi lệnh (không nhất thiết là đường dẫn), và trạng thái thoát của lệnh cuối cùng trong chuỗi xác định xem vòng lặp có tiếp tục hay không. Do đó: 'while ls; pwd; ngày; do echo Hi; ngủ 1; done' là hợp lệ và trạng thái thoát của 'ngày' kiểm soát xem vòng lặp có tiếp tục hay không. Tôi đã sử dụng dấu chấm phẩy vì bạn không thể định dạng dòng mới trong nhận xét, nhưng bạn có thể viết các lệnh trên nhiều dòng trong một tập lệnh shell. –