Pour l'exemple que tu donnes, l'erreur n'est trouvée que ligne 5 parce que :
=> le then n'est pas détecté ligne 1 (considéré comme un paramêtre à la commande [
=> il est autorisé d'avoir une commande composée dans le if
=> c'est donc en voyant le fi qu'il se dit qu'il manque quelque chose.
bizarre parce queif commande 1
commande 2; commande 3; then echo truc; fi
Pour les commandes composées dans le if ça peut paraître ...n'a pas grand intérêt. Ça fait ce à quoi on s'attend, c'est à dire
=> exécuter commande 1; commande 2; commande 3
=> le résultat est donc celui de commande 3
=> exécuter le echo si le résultat du if est vrai (donc si commande3 est vraie)
Alors pourquoi autoriser les commandes composées ? Pour deux raisons :
=> Parce que au delà du ; on peut aussi composer les commandes avec && et ||, et là ça devient utile
=> Parce qu'il est dit qu'une commande composée est équivalente à une commande simple. Donc pour être cohérent, quand on accepte l'un il faut accepter l'autre.
Pour l'anecdote, on peut vraiment mettre n'importe quelle commande derrière un if. Exemple de truc inutile et très moche :
if test -d / &&
while echo foo; test -d /; date +%S | grep -v 0$ >/dev/null
do sleep 1
done && test -d /
then echo toto
fi