Porque then
não é um comando nem um shell incorporado, mas na verdade faz parte da sintaxe if
. De 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.
Então isso:
if [ $table = "Session" ]; then continue; fi
funciona porque os comandos [ $table = "Session" ]
e continue
são comandos independentes; eles compõem a respectiva parte list
do comando if
. Basta colá-los em um shell interativo e você verá que eles não causarão erros de sintaxe:
martin@martin:~$ export table=test
martin@martin:~$ [ $table = "Session" ]
martin@martin:~$ continue
bash: continue: only meaningful in a 'for', 'while', or 'until' loop
Por outro lado, then
não é um comando real que pode ser usado sozinho:
martin@martin:~$ then
bash: syntax error near unexpected token 'then'
Assim, nos dois primeiros exemplos, você está usando if
da mesma forma que a página do manual descreve:
if list; then list; fi
Mas se você colocar um ;
atrás de then
, bash
verá isso como um erro de sintaxe. Reconhecidamente, a sintaxe da shell pode parecer um pouco confusa às vezes, especialmente quando você está apenas começando a usá-la. Eu me lembro de estar muito confuso sobre o fato de que requer espaços em torno de [
e ]
, mas uma vez que você percebe que [
é na verdade um comando ou shell embutido, é compreensível. :)