Além do que outros usuários disseram, a sintaxe real do comando if
compound é:
if compound_list
then compound_list
[elif compound_list
then compound_list]...
[else compound_list]
fi
Onde compound_list
é, basicamente, uma lista de qualquer número de comandos. if
verificará o código de saída do último comando do primeiro COMPOUND_LIST
para decidir o que executar (o then ...
, um dos elif ...; then ...
ou else ...
).
Isso significa que você pode reescrevê-lo assim:
if foo "$1"; then
# Code to execute if foo returns 0
else
# Code to execute if foo returns 1
fi
Se foo
puder retornar muitos outros status ( 2
, 3
, ..., 254
, 255
), usar case
seria melhor:
foo "$1"
case "$?" in
0) # Code to execute if foo returns 0 ;;
1) # Code to execute if foo returns 1 ;;
2) # Code to execute if foo returns 2 ;;
3) # Code to execute if foo returns 3 ;;
...
254) # Code to execute if foo returns 254 ;;
255) # Code to execute if foo returns 255 ;;
esac
Editar 1
is ";" after "$1" is defined in syntax?
Sim e, como Kusalananda afirmou, é usado como delimitador de comandos.
POSIX define os seguintes comandos:
- Comando simples:
[assignments] program [arguments] [redirections]
- Pipeline:
[!] command [pipe_operator command]...
- Lista:
- lista AND-OR:
pipeline [and-or_list_operator pipeline]...
- Lista composta:
and-or_list [compound_list_operator and-or_list]
- Comando composto:
- Agrupando comandos:
-
( compound_list )
-
{ compound_list; }
- Para:
for name [in words]; do compound_list; done
- Caso:
case word in [[(] patterns ) compound_list ;;]... esac
- Se:
if compound_list; then compound_list; [elif compound_list; then compound_list;]... [else compound_list;] fi
- Enquanto:
while compound_list; do compound_list; done
- Até:
until compound_list; do compound_list; done
- Comando de definição de função:
name() compound_command [redirections]
Um compound_list_operator
pode ser um ponto-e-vírgula ou uma nova linha e é usado em um contexto compound_list
/ for
/ case
/ if
/ while
/ until
.
Observe que um ponto-e-vírgula também é necessário quando, no comando { compound_list; }
, o último comando de compound_list
e o colchete de fechamento }
estão na mesma linha.