2011-09-21 40 views
72

Tôi có một kịch bản shell trong đó có những điều sau đây:Dấu chấm phẩy thừa ở cuối dòng trong tập lệnh shell?

case $1 in 
    0) 
    echo $1 = 0; 
    OUTPUT=3;; 
    1) 
    echo $1 = 1; 
    OUTPUT=4;; 
    2) 
    echo $1 = 2; 
    OUTPUT=4;; 
esac 

HID=$2; 
BUNCH=16; 
LR=.008; 

Are phẩy hoàn toàn không cần thiết trong đoạn mã trên? Và có lý do gì cho một số người sử dụng dấu hai chấm không?

Dường như dấu chấm phẩy chỉ là dấu phân cách, thứ mà bạn sẽ sử dụng thay vì dòng mới.

Trả lời

105

Dấu chấm phẩy đơn ở cuối dòng là thừa, vì dòng mới cũng là dấu tách lệnh. case đặc biệt cần dấu chấm phẩy kép ở cuối lệnh cuối cùng trong mỗi khối mẫu; xem help case để biết chi tiết.

+9

Tuyệt vời! Vì vậy, nếu tôi hiểu bạn một cách chính xác, tôi có thể loại bỏ một cách an toàn bất kỳ dấu chấm phẩy đơn nào ở cuối dòng bất kỳ, nhưng không bao giờ có dấu chấm phẩy? – Nagel

+5

Điều đó là chính xác. –

22

Theo man bash:

metacharacter 
     A character that, when unquoted, separates words. One of the following: 
     | & ; () < > space tab 
    control operator 
     A token that performs a control function. It is one of the following symbols: 
     || & && ; ;; () | |& <newline> 

Vì vậy, ; có thể metacharater hoặc nhà điều hành kiểm soát, trong khi ;; luôn là một nhà điều hành kiểm soát (trong trường hợp lệnh).

Trong mã cụ thể của bạn, tất cả ; ở cuối dòng là không cần thiết. Tuy nhiên, cần có ;;.

4

Trong trường hợp đặc biệt tìm thấy; được sử dụng để chấm dứt các lệnh được gọi bởi -exec. Xem câu trả lời của @kenorb tới số question này.

1

@Ignacio Vazquez-Abrams

Trên thực tế đây không phải là hoàn toàn chính xác, dấu chấm phẩy đơn ở phần cuối của một dòng là không thừa và chắc chắn không phải là điều tương tự như dòng mới.

Từ Bash Reference Manual

lệnh ngăn cách bởi một ‘;’ được thực hiện tuần tự; vỏ chờ đợi cho mỗi lệnh để chấm dứt lần lượt. Trạng thái trả về là trạng thái thoát của lệnh cuối cùng được thực hiện.

lệnh được ngăn cách bởi "dòng mới" có thể thực hiện song song khi lệnh được phân cách bởi dấu chấm phẩy là luôn thực hiện tuần tự

+4

Điều này là sai. Không có sự khác biệt. Nếu bạn đọc cùng một phần của hướng dẫn sử dụng đúng cách, bạn sẽ thấy điều này, chỉ một vài dòng ở trên: 'Một chuỗi một hoặc nhiều dòng mới có thể xuất hiện trong danh sách để phân tách các lệnh, tương đương với dấu chấm phẩy. về dấu chấm phẩy áp dụng như nhau cho các dòng mới. –

+1

Tôi đồng ý rằng câu này không rõ ràng, tôi nghĩ ý nghĩa của tác giả là ";" và "\ n" cả hai có thể được sử dụng nhiều lần để phân tách các lệnh nhưng không phải là chúng đang làm điều tương tự. Tôi tìm thấy liên kết này: http://unix.stackexchange.com/questions/53390/is-there-a-way-to-run-process-parallelly-in-the-loop-of-a-bash-script Tôi cũng không biết điều này trước khi tôi thực sự gặp sự cố với một số tập lệnh mà tôi đã viết và được ghi nhận về sự khác biệt giữa ";" và "\ n" của một trong những đồng nghiệp của tôi. Thật không may, đây là một thời gian dài trước đây và tôi không thể nhớ nó là gì để đăng một ví dụ ở đây. –

+2

nếu bạn đọc bài đăng bạn đã liên kết với @IJ, bạn sẽ thấy rằng sự song song xuất phát từ '&' không phải là '\ n'. Trong một chú thích, nó có nghĩa là anh ta có thể bỏ qua dấu chấm phẩy vì rõ ràng, '&' cũng là một dấu tách lệnh giống như ';' và '\ n'. – Matthias

0

@ Opensourcebook-Amit

dòng mới tương đương với dấu chấm phẩy đơn (;) trên thiết bị đầu cuối hoặc trong tập lệnh shell.

Xem ví dụ dưới đây:

On termainal: [root @ máy chủ thử nghiệm] # ls; pwd;


Mở kịch bản shell:

[root @ máy chủ thử nghiệm] # cat test4.sh

echo "UserName hiện tại:" whoami

vang -e "\ nCurrent ngày: ";ngày;

[root test @ server] #

Nhưng tôi không đồng ý với nhận xét rằng & tương đương với newline hoặc dấu chấm phẩy đơn

& được chạy lệnh ở chế độ nền cũng là một tách lệnh nhưng không có tác dụng như dấu chấm phẩy hoặc dòng mới.

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