2014-12-14 37 views
27

Tôi có hai câu hỏi và có thể sử dụng một số câu hỏi giúp tôi hiểu chúng.

  1. Sự khác nhau giữa ${}$() là gì? Tôi hiểu rằng () có nghĩa là chạy lệnh trong vỏ riêng và đặt $ có nghĩa là chuyển giá trị cho biến. Ai đó có thể giúp tôi trong sự hiểu biết điều này? Hãy sửa tôi nếu tôi sai.

  2. Nếu chúng tôi có thể sử dụng /bash$ for ((i=0;i<10;i++)); do echo $i; done và hoạt động tốt thì tại sao tôi không thể sử dụng nó làm /bash$ while ((i=0;i<10;i++)); do echo $i; done? Sự khác biệt trong chu kỳ thực hiện cho cả hai là gì?

Trả lời

43

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.)

+1

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. –

-1
  1. hiểu biết của bạn là đúng. Để biết chi tiết về {} thấy bash ref - parameter expansion

  2. 'cho' và 'khi' có cú pháp khác nhau và cung cấp phong cách khác nhau kiểm soát lập trình viên cho một lần lặp. Hầu hết các ngôn ngữ không phải asm cung cấp một cú pháp tương tự.

Với thời gian, bạn có lẽ sẽ viết i=0; while [ $i -lt 10 ]; do echo $i; i=$((i + 1)); done trong bản chất quản lý tất cả mọi thứ về bản thân lặp

+0

Không phải của tôi bỏ phiếu xuống, nhưng OP có vẻ là khó hiểu '(lệnh ...)' với '$ (commnd ...)', mà là khá khác nhau một cách chi tiết, mặc dù họ chia sẻ một số phổ biến quá. Do đó, quan sát đầu tiên của bạn không hoàn toàn chính xác; sự hiểu biết của OP không hoàn toàn chính xác. –

+2

_Một số ngôn ngữ không phải asm cung cấp cú pháp tương tự._ Cái gì ??? –

+0

@gniourf_gniourf FOR syntax. Trong hầu hết các ngôn ngữ không được lắp ráp (trong kiến ​​thức hạn chế của tôi), không tính một số ngôn ngữ cổ như algol – Dinesh

15
  1. $() có nghĩa là: "đầu tiên đánh giá này, và sau đó đánh giá phần còn lại của dòng".

    Ex:

    echo $(pwd)/myFile.txt 
    

    sẽ được hiểu là

    echo /my/path/myFile.txt 
    

    Mặt khác ${} mở rộng một biến.

    Ex:

    MY_VAR=toto 
    echo ${MY_VAR}/myFile.txt 
    

    sẽ được hiểu là

    echo toto/myFile.txt 
    
  2. Tại sao tôi không thể sử dụng nó như bash$ while ((i=0;i<10;i++)); do echo $i; done

    Tôi sợ câu trả lời chỉ là cú pháp bash cho while không giống nhau làm cú pháp cho for.

+2

"đầu tiên đánh giá này, và sau đó đánh giá phần còn lại của dòng" - Tôi không hiểu mô tả này của '$ (...)'. –

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