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 = == .