Transforming if statement in case

1

Atualmente, estou testando alterações em meus scripts para fins de desempenho. Especificamente, desejo alterar as declarações if para case .

No entanto, sendo novato na programação shell, estou ficando preso neste tipo de declaração:

if [ "$A" == "x" -a "$B" == "y" ] 
    then
        let a=a+1
fi 

Eu tentei isso, mas não funcionou:

case "$A$B" in
    "x""y") let a=a+1
;;
esac

O que eu errei?

E é possível gerenciar um "!=" em declarações de caso? Tais como:

if [ "$A" == "x" -a "$B" != "y" ] 
then
    let a=a+1
fi 
    
por Matieu 22.03.2017 / 14:57

2 respostas

2

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.

    
por 22.03.2017 / 15:15
0
#  $A = "x" && $B = "y"
case ${A:--}/${B:--} in 'x/y' ) let a=a+1;; esac

# $A = "x" && $B != "y"
case $A in 'x' ) case $B in '' | ??* | [!y] ) let a=a+1;; esac;; esac
    
por 22.03.2017 / 17:17