Multi-Line Constructs

Recipes without an initial shebang are evaluated and run line-by-line, which means that multi-line constructs probably won’t do what you want.

For example, with the following justfile:

conditional:
  if true; then
    echo 'True!'
  fi

The extra leading whitespace before the second line of the conditional recipe will produce a parse error:

$ just conditional
error: Recipe line has extra leading whitespace
  |
3 |         echo 'True!'
  |     ^^^^^^^^^^^^^^^^

To work around this, you can write conditionals on one line, escape newlines with slashes, or add a shebang to your recipe. Some examples of multi-line constructs are provided for reference.

if statements

conditional:
  if true; then echo 'True!'; fi
conditional:
  if true; then \
    echo 'True!'; \
  fi
conditional:
  #!/usr/bin/env sh
  if true; then
    echo 'True!'
  fi

for loops

for:
  for file in `ls .`; do echo $file; done
for:
  for file in `ls .`; do \
    echo $file; \
  done
for:
  #!/usr/bin/env sh
  for file in `ls .`; do
    echo $file
  done

while loops

while:
  while `server-is-dead`; do ping -c 1 server; done
while:
  while `server-is-dead`; do \
    ping -c 1 server; \
  done
while:
  #!/usr/bin/env sh
  while `server-is-dead`; do
    ping -c 1 server
  done