Synopsis
Conditional gotoDescription
GotoIf(condition?label1[:label2])Go to label1 if condition is true or to next step (or label2 if defined) if condition is false, or
GotoIf(condition?[label1]:label2)
Go to next step (or label1 if defined) if condition is true or to label2 if condition is false.
Either label1 or label2 may be omitted (in that case, we just don't take the particular branch), but not both.
condition is just a string. If the string is empty or "0", the condition is considered to be false. If it is anything else, the condition is true. This is designed to be used together with expression syntax.
Labels take the form '[[context,]extension,]priority', so they can be (a) a priority, (b) an extension and a priority, or (c) a context, an extension and a priority. This is the same syntax as for the Goto command.
Example 1
exten => 206,1,GotoIf($["${CALLERID(num)}" = "303"]?dial1)
exten => 206,n,GotoIf($["${CALLERID(num)}" != "304"]?moh:dial2)
exten => 206,n(dial1),Dial(${SPHONE1},15,rt)
exten => 206,n,Hangup()
exten => 206,n(dial2),Dial(${PHONE2},15,rt)
exten => 206,n,Hangup()
exten => 206,n(moh),MusicOnHold(default)20050427 - Note that ${CALLERID(num)} can contain spaces (e.g. "No CID available" from some Zap channels), and the example above has been corrected to cope with this situation - without the quotes around ${CALLERID(num)} it doesn't work!
Example 2
; Are the first three digits of the returned value of ${ENUM} are
; either SIP or IAX? If not, we ignore and pass to normal
; dialing path at priority 4.
;
exten => _011X.,2,GotoIf($[$["${ENUM:0:3}" = "SIP"] | $["${ENUM:0:3}" = "IAX"]]?3:4)
Example 3
; This example checks for blank caller ID or 800 numbers.
; Callers from 800 numbers (usually telemarketers) or those
; with no caller ID are asked to press 1 to speak with me.
exten => s,1,NoOp(${CALLERID}) ; log callerID string
; check for callerID. If none, make them hit 1.
exten => s,n,GotoIf($["${CALLERID(num)}" = ""]?1000)
; If 800 number, make them hit 1.
exten => s,n,GotoIf($["${CALLERID(num):0:3}" = "877"]?1000)
exten => s,n,GotoIf($["${CALLERID(num):0:3}" = "800"]?1000)
; OK, we have valid caller ID and it's not an 800 number.
; Let's ring our phones now:
exten => s,n,Dial(SIP/604&SIP/602,25,tr)
exten => s,1000,Background(press1tospeaktome)
Example 4 with func_odbc
in func_odbc.conf:[ISLOCAL]
dsn=foo
read=SELECT COUNT(*) FROM localexchanges WHERE prefix='${ARG1:0:6}'
in extensions.conf:
exten => _011-1-NXX-NXX-XXXX,1,GotoIf(${ODBC_ISLOCAL(${EXTEN:4})}?${EXTEN:4},1:${EXTEN:3},1)
Hints
It is worthwhile adding a test for null values, even though modern versions of Asterisk and/or Bison are known to work,
It seems that some still require a hack to test for null values:
For example, assume that the function CALLERID(num) returns an empty string
GotoIf($[${CALLERID(num)} = 123456789]?3:2)
will cause an error. Instead, use either
GotoIf($[foo${CALLERID(num)} = foo123456789]?3:2)
or
GotoIf($["${CALLERID(num)}" = "123456789"]?3:2)
Note that if CALLERID(num) contains a space, the first alternative (foo${CALLERID(num)}) will fail with an error. The use of speech-marks ("") is therefore the recommended method.
Likewise you might want to add a leading 0 if you need to perform a numeric comparison:
$[0${GROUP_COUNT(numcalls)} > 40]
Also, the use of spacing is very important if you're not using quoted values on both sides of the comparison. So, when testing characters 2 and 3 of ARG1 when ARG1 = "u6432" :
; will correctly evaluate to false (and carry on at step 3):
exten => s,2,GotoIf($[${ARG1:1:2} = 61]?6100)
; will always evaluate true (and wrongly jump to step 6100):
exten => s,2,GotoIf($[${ARG1:1:2}=61]?6100)
; will complain about a mismatched number of characters in
; the comparison (notice the space), thus:
exten => s,2,GotoIf($[${ARG1:1:2} =61]?6100)
ast_yyerror: ast_yyerror(): syntax error: syntax error; Input: 64 =61
See also
- Asterisk func IF: IF function
- Asterisk cmd ExecIf
- Goto - Jump to label
- GotoIfTime
- Gosub: Jump to a subroutine (new in v1.2)
- GosubIf: Conditional jump to a subroutine (new in v1.2)
- Random - Jump to label based on random probability
- Asterisk Expressions
- Using Variables in Asterisk Dialplans
- The Dialplan - extensions.conf
Asterisk | Applications | Functions | Variables | Expressions | Asterisk FAQ
Comments
333Watch the Spaces
In 1.2.7.1 due to the spaces this will always evaulate to A. Instead you must remove the spaces and use GotoIf($ foo = bar ?A:B).
333Spaces are required
333Example (corrected)
exten => 206,1,GotoIf($[${CALLERIDNUM} = 303]]?3:2)
exten => 206,2,GotoIf($[${CALLERIDNUM} = 304]]?5:7)
exten => 206,3,Dial(${SPHONE1},15,rt)
exten => 206,4,Hangup
exten => 206,5,Dial(${PHONE2},15,rt)
exten => 206,6,Hangup
exten => 206,7,MusicOnHold(default)
333Example
exten => 206,1,GotoIf($${CALLERIDNUM} = 303?3:2)
exten => 206,2,GotoIf($${CALLERIDNUM} = 304?5:7)
exten => 206,3,Dial(${SWISS1},15,rt)
exten => 206,4,Hangup
exten => 206,5,Dial(${SWISS2},15,rt)
exten => 206,6,Hangup
exten => 206,7,MusicOnHold(default)