Pessoalmente, acho que não há problema em ter uma instrução if
aninhada aqui, embora eu usasse uma sintaxe ligeiramente modernizada:
if [ "$a" = "y" ] || [ "$a" = "Y" ]; then
if printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
# both conditions met: do stuff
fi
fi
(observe que ==
é um bash
-ism)
Para combiná-los (torna IMHO menos legível):
if [ "$a" = "y" ] || [ "$a" = "Y" ] && printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
# both conditions met: do stuff
fi
Para expressões regulares básicas , você pode usar expr
(consulte comentário por Stéphane Chazelas abaixo embora ):
if [ "$a" = "y" ] || [ "$a" = "Y" ] && expr "$b" : 'SOME_REGEX' >/dev/null; then
# both conditions met: do stuff
fi
O shell /bin/sh
geralmente não tem [[ ... =~ ... ]]
para corresponder à expressão regular estendida.
Com relação à sua nota no final: expressões regulares são para correspondência entre linhas simples de texto . Se você tratar nomes de arquivos como texto, desqualifica automaticamente qualquer nome de arquivo que não seja uma única linha de texto, como nomes de arquivos contendo novas linhas. Se você precisar aplicar a expressão regular correspondente aos nomes de arquivos, faça isso com os nomes armazenados em uma matriz ( $@
in /bin/sh
) ou use uma implementação de find
que suporte o predicado -regex
.
Padrões globbing de nome de arquivo são para nomes de arquivos correspondentes.