{echo} evaluates the expression written after its name and prints the value. The whole text up to the closing brace is one expression - it is not split into parameters - so {echo $price * $qty}, {echo $n gt 1 ? 'items' : 'item'} and {echo 'Hello ' . $name} all work. A quoted text is a literal: {echo 5 + 3} prints 8, {echo '5 + 3'} prints the text itself.

It is the tag to put in front of a pipe when the value is a literal or an expression: {echo $text | trim | upper}, {echo $value | + 1} (an arithmetic pipe needs the space after its operator). A field can be piped directly as well - {$name | upper} - and that is the difference that matters: the field tag runs the sanitize chain, {echo} does not. {echo $html} writes the value as it stands, markup and all, so use {$html} for anything a visitor typed and keep {echo} for values the application made itself.

A value is text, never template code: with $v = '{php:getcwd}', {echo $v} prints those characters rather than running them. TRUE prints as 1, FALSE and NULL as nothing.

Under the strict syntax check an {echo} with nothing before its first pipe - or nothing at all - is an error, as is an undefined field or a pipe function that does not exist.