Dấu chấm phẩy thừa ở cuối dòng trong tập lệnh shell?


103

Tôi có một tập lệnh shell chứa những thứ sau:

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;

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

Có vẻ như dấu chấm phẩy chỉ là một dấu phân cách, một cái gì đó bạn sẽ sử dụng thay vì một dòng mới.

Câu trả lời:


150

Dấu chấm phẩy đơn ở cuối dòng là không cần thiết, vì dòng mới cũng là dấu phân cá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 casechi tiết.


20
Tuyệt quá! 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 đôi?
Nagel

29

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ể là siêu ký tự hoặc toán tử điều khiển, trong khi ;;luôn là toán tử điều khiển (trong lệnh trường hợp).

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


4
Sự khác biệt thực tế giữa ;;;, sau đó là gì? Tôi không đủ quen thuộc với phân tích cú pháp BASH để biết sự khác biệt thực tế giữa cái mà BASH gọi là "siêu ký tự" và cái mà nó gọi là "toán tử điều khiển".
jvriesem

1
đồng ý với jvriesem của câu hỏi & ý kiến, các tài liệu đoạn mã có vẻ hơi quá hẹp
grgry

6

Trong trường hợp đặc biệt của find, ;được sử dụng để kết thúc các lệnh được gọi bởi -exec. Hãy xem câu trả lời của @kenorb cho câu hỏi này .


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 các ví dụ dưới đây:

Trên thiết bị đầu cuối:

[root@server test]# ls;pwd;

Trên tập lệnh shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

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

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


-2

@Ignacio Vazquez-Abrams

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

Từ Sổ tay Tham khảo Bash

Các lệnh được phân tách bằng dấu ';' được thực hiện tuần tự; shell đợi từng lệnh kết thúc 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.

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


5
Điều này là sai. Không có sự khác biệt. Nếu bạn đọc đúng phần của sách hướng dẫn, bạn sẽ thấy điều này, chỉ một vài dòng ở trên: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Vì vậy, những gì bạn đã trích dẫn về dấu chấm phẩy cũng áp dụng cho các dòng mới.
underscore_d

1
Tôi đồng ý rằng câu này là mơ hồ, tôi nghĩ ý của tác giả là ";" và "\ n" đều có thể được sử dụng nhiều lần để tách các lệnh nhưng không phải là chúng đang làm cùng một điều. Tôi đã tìm thấy liên kết này: unix.stackexchange.com/questions/53390/… 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 lưu ý về sự khác biệt giữa ";" và "\ n" bởi một đồng nghiệp của tôi. Thật không may, đây là một thời gian dài và tôi không thể nhớ nó là gì để đăng một ví dụ ở đây.
IJ

2
nếu bạn đọc bài đăng mà bạn liên kết với @IJ, bạn sẽ thấy rằng sự song song đến từ &không phải \n. Trong một bình luận, người ta nói rằng anh ta có thể bỏ qua dấu chấm phẩy vì rõ ràng, &cũng là một dấu phân cách lệnh giống như ;\n.
Matthias
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.