Como usar dois operandos no lado esquerdo de um operador de comparação no Bash

0

Isto é:

3.8.13-68.3.4.el6uek.x86_64 #2 SMP Tue Jul 14 15:03:36 PDT 2015 x86_64 x86_64 x86_64 GNU/Linux

bash --version
    GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

Estou familiarizado com a seguinte sintaxe:

[ $VAR = "iotools" ] || [ $VAR_2 = "iotools" ]

em que $VAR deve conter o valor iotools ou $VAR_2 deve conter o valor iotools .

Existe uma maneira de escrever como abaixo:

[ $VAR||$VAR_2 = "iotools" ]

A ideia é economizar espaço consumido pelo código e livrar-se do código extra no segundo par de colchetes.

    
por user3146086 06.03.2016 / 22:02

2 respostas

4

Não, você não pode encurtar o lado esquerdo da comparação. Você pode, no entanto, usar um padrão no lado direito:

[[ iotools == @("$VAR"|"$VAR_2") ]]

Observe que você precisa usar [[ ... ]] em vez de [ ... ] para que isso funcione. Veja Pattern Matching em man bash para detalhes.

As variáveis devem ser citadas para evitar que VAR='a|iotools|b' corresponda.

    
por 06.03.2016 / 22:13
1

Como você está usando o bash, isso pode ser feito usando dois conceitos:

  • Existe uma maneira de listar várias variáveis com nome semelhante:

    VAR=iotools
    VAR_2=tools2
    VAR_3=othertools
    
    printf '<%s> ' "${!VAR@}"
    

    imprimirá:

    <VAR> <VAR_2> <VAR_3>
    
  • Isso também pode ser feito indiretamente ${!var} (var é uma variável diferente de $ VAR):

    for var in "${!VAR@}"; do
        printf '<%s> '  "${!var}"
    done
    

    imprimirá:

    <iotools> <tools2> <othertools>
    

Todos juntos serão:

#!/bin/bash

VAR=iotools
VAR_2=tools2
VAR_3=othertools

testvalue="$1"

for var in "${!VAR@}"; do
    if [[ ${!var} == $testvalue ]]; then
        echo "Some value matched"
        break
    fi
done

Ligue assim:

$ script iotools
Some value matched
$ script notool
$
    
por 07.03.2016 / 02:22

Tags