Eu usei este seguinte pedaço de código
appcount_range="^[1-$APP_COUNT]$"
until [[ $APP_OPTION =~ $appcount_range ]]
do
echo "INVALID CHOICE! Please enter a valid option:"
read APP_OPTION
done
Verifica se a opção de menu foi digitada corretamente. E como o APP_COUNT é decidido dinamicamente, não posso codificar as opções válidas. Este pedaço de código funciona perfeitamente em um servidor baseado em Linux com ksh93, mas o mesmo código fornece um erro de sintaxe em um servidor Solaris com ksh88 dizendo:
syntax error at line ## : '=~' unexpected
Por que =~
um operador não é reconhecido no ksh88 e o que devo usar como alternativa para comparar um regex?
Esse é um erro que ksh88 (o
/bin/ksh
do Solaris 10 e anterior e/usr/xpg4/bin/sh
) produziria.Enquanto a
[[ ... ]]
sintaxe vem de ksh,=~
dentro é um dos poucos bashisms reais.bash
na verdade foi o shell que o introduziu (na versão 3.0).Ele foi adicionado posteriormente a
ksh93
(assim funcionaria com o/bin/sh
e/bin/ksh
do Solaris 11 e mais recente) ezsh
, com variações (um=~
operador também está disponível notest
/[
builin dezsh
eyash
). 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, um padrão curinga também funcionará:
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:Observe que não funcionaria para nenhum valor maior que 9.
[1-12]
, o mesmo que[21-1]
correspondências apenas em 2 e 1 (e possivelmente outros caracteres que agrupam o mesmo que1
em algumas localidades)).Os padrões curinga ksh são funcionalmente equivalentes a expressões regulares estendidas (exceto para os
{x,y}
operadores de intervalo em variantes modernas de EREs), embora com uma sintaxe diferente:.
->?
.*
->*
x*
->*(x)
x|y
->@(x|y)
x?
->?(x)
x+
->+(x)
[^x]
->[!x]
x{3,5}
->xxx?(x)?(x)
(ksh93 tem{3,5}(x)
, não em ksh88).Se você ainda precisar usar expressões regulares, precisará usar um utilitário separado: