Esse é um erro que o ksh88 (o /bin/ksh
do Solaris 10 e mais antigo e /usr/xpg4/bin/sh
) produziria.
Embora a sintaxe [[ ... ]]
venha de ksh, =~
inside é um dos poucos bashisms reais. bash
na verdade foi o shell que o introduziu (na versão 3.0).
Foi adicionado posteriormente a ksh93
(portanto, funcionaria com /bin/sh
e /bin/ksh
do Solaris 11 e mais recente) e zsh
, com variações (um operador =~
também está disponível no test
/ [
builin de zsh
e yash
). O ksh88 não foi atualizado desde os anos 90 (exceto para correções de bugs, ou correções de conformidade POSIX em alguns sistemas).
Aqui, você não precisa de um regexp, mas um padrão curinga também funcionará:
[[ $APP_OPTION = [1-$APP_COUNT] ]]
Com o operador =
(de ksh), o operando à direita é um padrão curinga. Ou você pode usar a maneira padrão de fazer correspondência de padrões:
case $APP_OPTION in
[1-$APP_COUNT]) ...
esac
Observe que não funcionaria para nenhum valor maior que 9. [1-12]
, o mesmo que [21-1]
corresponde apenas a 2 e 1 (e possivelmente outros caracteres que combinam o mesmo que 1
em algumas localidades)) .
Os padrões de caracteres curinga do ksh são funcionalmente equivalentes às expressões regulares estendidas (exceto para os operadores {x,y}
interval em variantes modernas de EREs), embora com uma sintaxe diferente:
-
.
- > %código% -
?
- > %código% -
.*
- > %código% -
*
- > %código% -
x*
- > %código% -
*(x)
- > %código% -
x|y
- > %código% -
@(x|y)
- >x?
(ksh93 tem?(x)
, não em ksh88).
Se você ainda precisasse usar expressões regulares, você precisaria usar um utilitário separado:
expr "x$string" : "x$regexp" # BRE, anchored at the start
STRING=$string RE=$regexp command -p awk '
BEGIN{exit(!(ENVIRON["STRING"] ~ ENVIRON["RE"]))}'