### 2.9 Control Flow

Because Eshell commands can not (easily) be combined with Lisp forms,
Eshell provides command-oriented control flow statements for
convenience.

Most of Eshell’s control flow statements accept a `conditional`.
This can take a few different forms. If `conditional` is a dollar
expansion, the condition is satisfied if the result is a
non-`nil`

value. If `conditional` is a ‘`{
``subcommand` }’ or ‘`(``lisp form`)’, the condition is
satisfied if the command’s exit status is 0.

`if ``conditional` { `true-commands` }

`if ``conditional` { `true-commands` } { `false-commands` }

Evaluate `true-commands` if `conditional` is satisfied;
otherwise, evaluate `false-commands`.

`unless ``conditional` { `false-commands` }

`unless ``conditional` { `false-commands` } { `true-commands` }

Evaluate `false-commands` if `conditional` is not satisfied;
otherwise, evaluate `true-commands`.

`while ``conditional` { `commands` }

Repeatedly evaluate `commands` so long as `conditional` is
satisfied.

`until ``conditional` { `commands` }

Repeatedly evaluate `commands` until `conditional` is
satisfied.

`for ``var` in `list`… { `commands` }

Iterate over each element of `list`, storing the element in
`var` and evaluating `commands`. If `list` is not a list,
treat it as a list of one element. If you specify multiple
`lists`, this will iterate over each of them in turn.