Macro Conditionals: $?, $|, and $.
Occasionally, it is necessary to test a sendmail macro to see whether a value has been assigned to it. To perform such a test, a special prefix and two operators are used. The general form is:
if else endif ↓ ↓ ↓ $?x text1 $| text2 $. ↑ ↑if x is defined if x is not defined
This expression yields one of two possible values:
text1
if the macro named x
has
a value, text2
if it doesn’t. The
entire expression, starting with the $?
and ending
with the $
., yields a single value, which can
contain multiple tokens.
The following, for example, includes the configuration-file version
in the SMTP greeting message but does so only if that version (in
$Z
; see $Z) is defined:
O SmtpGreetingMessage=$j Sendmail ($v/$?Z$Z$|generic$.
) ready at $b
↑note
Here, the parenthetical version information is expressed one way if
$Z
has a value (such as 1.4
):
($v/$Z)
but is expressed differently if $Z
lacks a value:
($v/generic)
The else part ($|
) of this
conditional expression is optional. If it is omitted, the result is
the same as if the text2
were omitted:
$?xtext1$|$. $?xtext1$.
Both of the preceding yield the same result. If x
has a value, text1
becomes the value of the entire
expression. If x
lacks a value, the entire
expression lacks a value (produces no tokens).
Note that it is not advisable to use the
$?
conditional expression in rules. Such a use can
have other than the intended effect because macro conditionals are
expanded when the configuration file is read.
Conditionals ...
Get Sendmail, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.