done(or quote to make it literal).
for f in *; do echo "$f" done
echo $f is done
for f in *; do echo "$f"; done
echo "$f is done"
ShellCheck found a keyword like
esac, etc used as the argument of a command. This means that the shell will interpret it as a literal string rather than a shell keyword. To be interpreted as a keyword, it must be the first word in the line (i.e. after
& or a linefeed).
In the example,
echo "$f" done is the same as
echo "$f" "done", and the
done does not terminate the loop. This is fixed by terminating the
echo command with a
; so that the
done is the first word in the next line.
If you're intentionally using
done as a literal, you can quote it to make this clear to ShellCheck (and also human readers), e.g. instead of
echo Task is done, use
echo "Task is done". This makes no difference to the shell, but it will silence this warning.
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.