Seu case
exemplo funciona para mim, mas observe que você está comparando a concatenação de A
e B
, então o padrão também corresponderá se, digamos, A
for xy
e B
estão vazios. (Acho que as aspas duplas no meio são redundantes). case
usa apenas uma única palavra para comparar com os padrões, então você não pode comparar várias variáveis, exceto concatenando.
No comando padrão test
ou [
, o operador de comparação é =
. ==
funciona em alguns sistemas, mas não em todos. Além disso, combinar condições usando -a
é problemático, pelo menos com condições como -n
. (veja esta questão ). Melhor uso if [ "$A" = x ] && [ "$B" = y ] ; then ...
.
Quanto a inverter um case
, você precisa criar um padrão que corresponda a tudo, menos a string de destino. extglob
no Bash e outros permite a correspondência de qualquer coisa, exceto:
case $B in !(y) ) echo not y ;; esac
Sem isso, você precisaria trabalhar um pouco mais para inverter o padrão ou usar vários padrões com os primeiros correspondentes à string e uma correspondência padrão posterior fazendo a ação real.
case $B in ??*) echo not y ;; [^y]) echo also not y ;; esac
case $B in y) ;; *) echo still not y ;; esac
(não há garantias, especialmente no primeiro. Francamente, toda a idéia de fazer isso parece horrível.)
De qualquer forma, desde que você mencionou razões de desempenho, você pode considerar mudar para Perl ou Python ao invés do shell, não tanto por causa de comparações simples, mas porque eles permitirão que você faça mais sem chamar programas externos (como grep
, sed
, cut
ou jq
). Além disso, a primeira regra de otimizações de desempenho: meça a diferença.