Em uma expressão Asterisk $[]
, as variáveis indefinidas não retornam uma cadeia vazia implícita ou zero. Eles se expandem como "nada" antes da avaliação da expressão, portanto, depois que a variável é expandida (para nada), ela não é visível para o analisador de expressão. Isso faz com que o erro já observado por Pablo Alsina:
GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")
Existem duas maneiras de evitar isso:
- Sempre dê às suas variáveis padrões razoáveis antes de usá-los (como sugerido por Pablo).
- Em qualquer expressão
$[]
, coloque suas variáveis e literais com aspas duplas. Isso fará com que uma variável indefinida seja tratada como uma string vazia, que ainda pode ser usada para fins de comparação.
Pessoalmente, tento fazer as duas coisas. Por exemplo:
exten => START,n,Set(FORCE_CLOSED=FALSE)
exten => START,n,GotoIf($["${FORCE_CLOSED}"="TRUE"]?CLOSED,1)
Observe as aspas duplas em torno de ${FORCE_CLOSED}
e o valor de comparação. Mesmo que a variável seja indefinida, a expressão terá ""
(uma string vazia) para comparar com "TRUE"
.
Realmente, você pode usar qualquer caractere que quiser, porque ele será anexado à expansão da variável. Ele apenas fornece um valor literal garantido, caso a variável seja indefinida. Eu gosto de citações porque faz o código se assemelhar a outras linguagens de programação. Você poderia facilmente usar algo como $[x${FORCE_CLOSED}=xTRUE]
, que é comumente visto no shell script do Bourne. O resultado final é o mesmo.