Bởi vì then
khô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 if
cú 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" ]
và continue
là các lệnh có thể độc lập; họ chiếm phần tương ứng list
của if
lệ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, then
khô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 if
giống như trang man mô tả nó:
if list; then list; fi
Nhưng nếu bạn đặt ;
phía sau then
, bash
sẽ 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 [
và ]
, 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. :)
;
bằng mộtnewline
và nó hoạt động. Otoh, bỏ qua dòng vớicontinue
và bạn nhận được lỗi. Đọc nguồn, Ben.