Com a sintaxe sh
padrão:
case ${table_name##*_} in
("$table_name" | "" | *[!0-9]*) echo >&2 incorrect;;
(*) echo correct;;
esac
Isso é verificar se $table_name
de tudo despojado até o nível mais alto _
não é $table_name
(o que significa $table_name
não tem _
), nem a string vazia, nem continha um caractere não digitável.
O comando padrão para corresponder uma string a um regexp é expr
, embora tenha alguns problemas e não um código muito legível:
if expr " $table_name" : '.*_[0-9]\{1,\}$' > /dev/null; then
echo Correct
else
echo >&2 Incorrect
fi
O espaço principal é evitar problemas com valores de $table_name
, como +
ou --help
. regexps são ancorados no início implicitamente (daí o .*
) mas não no final (daí o $
) e o resultado (0 ou 1 aqui) é gerado no stdout além de ser refletido no status de saída, daí o redirecionamento para / dev / null.
Algumas implementações [
como [
integradas de zsh
e yash
têm um operador =~
para isso (usando ERE, embora você possa alterar isso para PCRE com zsh
):
if [ "$table_name" '=~' '_[0-9]+$' ]; then
echo Correct
else
echo >&2 Incorrect
fi
bash
, zsh
e ksh93
têm um operador =~
dentro de sua construção [[...]]
, embora a sintaxe e o comportamento entre aspas variem entre as implementações. O melhor é usar as variáveis como já foi mostrado por @BLayer
zsh -o extendedglob
e ksh
(ou bash -O extglob
ou zsh -o kshglob
que suportam um subconjunto de ksh
globs) têm operadores glob que são funcionalmente equivalentes a regexps embora com uma sintaxe diferente.
Tradução RE - > ksh-glob / zsh-glob:
-
[0-9]
- >[0-9]
/[0-9]
-
x+
- >+(x)
/x##
-
$
ou^
- > implícito / implícito -
.
- > %código% -
?
- >.*
(ou*
) /*(?)
(ou*
)
Então, em ?#
(ou ksh
ou bash -O extglob
):
case $table_name in
(*_+([0-9]) echo correct;;
(*) echo >&2 incorrect;;
esac
Em zsh -o kshglob
:
case $table_name in
(*_[0-9]##) echo correct;;
(*) echo >&2 incorrect;;
esac
zsh -o extendedglob
também tem o operador zsh
extended glob para corresponder números decimais de <x-y>
a x
, para que você também possa escrever y
.
Nesses shells, esses globs também podem ser usados no lado direito do operador (*_<->) echo correct
aka =
==
.