Tại sao sau đó không phải là dấu chấm phẩy được chấp nhận?


8

Tôi chưa quen với lập trình shell và nhận thấy rằng những điều sau đây được chấp nhận:

if [ $table = "Session" ]; then
continue; fi

Và như sau:

if [ $table = "Session" ]; then continue; fi

Trong khi sau đây tạo ra một lỗi cú pháp:

if [ $table = "Session" ]; then; continue; fi

Tại sao thentừ khóa khác với các từ khóa khác?


Điều này trông giống như một vấn đề trong vỏ đối với tôi. Thay thế ;bằng một newlinevà nó hoạt động. Otoh, bỏ qua dòng với continuevà bạn nhận được lỗi. Đọc nguồn, Ben.
ott--

Câu trả lời:


14

Bởi vì thenkhông phải là lệnh cũng không phải là shell dựng sẵn, mà thực sự là một phần của ifcú pháp. Từ man bash:

   if list; then list; [ elif list; then list; ] ... [ else list; ] fi
          The  if  list is executed.  If its exit status is zero, the then
          list is executed.  Otherwise, each  elif  list  is  executed  in
          turn,  and  if  its  exit status is zero, the corresponding then
          list is executed and the command completes.  Otherwise, the else
          list  is executed, if present.  The exit status is the exit sta
          tus of the last command executed, or zero if no condition tested
          true.

Vậy đây:

if [ $table = "Session" ]; then continue; fi

hoạt động vì cả hai [ $table = "Session" ]continuelà các lệnh có thể độc lập; họ chiếm phần tương ứng listcủa iflệnh. Chỉ cần dán chúng vào một vỏ tương tác và bạn sẽ thấy rằng chúng sẽ không gây ra bất kỳ lỗi cú pháp nào:

martin@martin:~$ export table=test
martin@martin:~$ [ $table = "Session" ]
martin@martin:~$ continue
bash: continue: only meaningful in a `for', `while', or `until' loop

Mặt khác, thenkhông phải là một lệnh thực sự có thể tự đứng vững:

martin@martin:~$ then
bash: syntax error near unexpected token `then'

Vì vậy, trong hai ví dụ đầu tiên, bạn đang sử dụng ifgiống như trang man mô tả nó:

if list; then list; fi

Nhưng nếu bạn đặt ;phía sau then, bashsẽ thấy đây là lỗi cú pháp. Phải thừa nhận rằng, cú pháp shell đôi khi có vẻ khá khó hiểu, đặc biệt là khi bạn mới bắt đầu sử dụng nó. Tôi nhớ là đã rất bối rối về thực tế rằng nó đòi hỏi không gian xung quanh [], nhưng một khi bạn nhận ra rằng đó [thực sự là một lệnh hoặc shell dựng sẵn, nó có thể hiểu được. :)


7

Bạn cần đặt một dấu chấm phẩy sau một lệnh. [ … ]là một lệnh, như là continue. Mặt khác if, thenfikhông phải là lệnh: chúng là những từ dành riêng.

ifTrông giống như một lệnh, nhưng đó là vì nó hầu như luôn tuân theo chính xác một lệnh. Nó là hợp lệ để viết

if print_table_value >foo; [ "$(cat foo)" = "Session" ]; then 

cũng có thể được trình bày theo một số cách như

if
  print_table_value >foo
  [ "$(cat foo)" = "Session" ]
then

Cú pháp chung của lệnh có điều kiện là

nếu danh sách hợp chất sau đó danh sách hợp chất 
( danh sách hợp chất elif sau đó danh sách hợp chất ) * 
( danh sách hợp chất khác sau đó danh sách hợp chất ) ?
fi

Ở đâu

  • Các ngắt dòng chỉ dành cho khả năng đọc.
  • Một hợp chất-list là danh sách các lệnh, mỗi chấm dứt bởi một ;hoặc xuống dòng.
  • (Cẩu) ? chỉ ra một phần tùy chọn và (Nhiều) * chỉ ra một phần có thể lặp lại 0, 1 hoặc nhiều lần.

Từ khóa chỉ được công nhận như vậy khi bắt đầu một lệnh.

Một lệnh có điều kiện phải kết thúc với từ khóa fi. Điều này không loại bỏ sự cần thiết phải tuân theo nó bởi một toán tử nếu một số lệnh khác xuất hiện sau nó; ví dụ, nếu điều kiện được theo sau bởi một lệnh khác, thì cần phải có một ;hoặc một dòng mới ở giữa; nếu điều kiện được thực hiện trong nền, thì nó cần phải được theo sau &, v.v.

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.