O comando padrão test , também conhecido como [ , não possui um operador =~ . A maioria das shells tem esse comando embutido hoje em dia.
O shell Korn introduziu uma construção [[...]] (não um comando [[ ) com sintaxe alternativa e regras de análise diferentes.
zsh e bash copiaram que, até certo ponto, com restrições e muitas diferenças, mas que nunca foram padronizadas, não devem ser usadas em scripts sh portáteis.
ksh93 sempre teve uma maneira de converter um regexp estendido em seus globs com:
printf '%P\n' "regexp"
E você poderia fazer:
[[ $var = pattern ]]
Mais tarde (em algum momento entre 2001 e 2003) também incorporou expressões regulares em seus globs como na sintaxe ~(E)regex para expressões regulares estendidas, então você pode fazer:
[[ $var = ~(E)pattern ]]
Esse tipo de correspondência de padrões funciona apenas com o comando [[...]] ou case , não o [ .
zsh adicionou um operador de correspondência de expressões regulares para o comando [ e [[...]] primeiro em 2001 com um módulo pcre . A sintaxe foi inicialmente [ string -pcre-match regex ] ou [[ string -pcre-match regex ]] .
bash adicionou um operador =~ no bash 3.0 (em 2004). Usando expressões regulares estendidas. Isso foi adicionado logo depois por ksh93 e zsh também (novamente com diferenças).
ksh93 e bash-3.1 e acima usam aspas para o escape operador regexp causando todos os tipos de confusão e significando que não pode ser usado com o comando [ lá. zsh não tem esse problema (aspas são usadas para aspas shell e backslash para escapar do operador regex como de costume), então o operador =~ trabalha no comando zsh [ (embora ele próprio precise ser citado desde =foo é um operador globbing em zsh ).
yash (um pequeno shell POSIX) não tem [[...]] , mas seu comando [ tem um operador =~ (usando EREs) e funciona como esperado (como zsh 's) .
Em qualquer caso, nem [[...]] nem =~ são POSIX e devem ser usados em sh scripts. O comando padrão para fazer correspondência de expressões regulares em strings é expr :
if expr "x$var" : "x$regex" > /dev/null; then...
Observe que% regexpsexpr estão ancorados no início e você precisa do truque x para evitar problemas com $var valores que são expr operadores.
Na maioria das vezes, você não precisa de regexp, já que a correspondência simples de padrões de shell é suficiente para a maioria dos casos:
case $var in
(pattern) echo matches
esac