Pular para o conteúdo

Verificar se um determinado valor está contido em um determinado array?

Responder tópico
  • Denunciar
  • Indicar

1. Verificar se um determinado valor está contido em um determinado array?

Enviado em 26/08/2017 - 12:34h

como faço para verificar se um determinado valor armazenado em uma variável está contido em um determinado array?

segue um exemplo ilustrativo...:
teste="hotel"

array2=("casa" "apartamento" "hotel" "fazenda" "comércio")

como verificar se o valor "hotel" armazenado na variável "teste" está contido nos valores armazenados na variável array2?

minha intenção é algo semelhante a ....:
if [ $teste in ${array2[@]} ]
then
...
fi

Responder tópico

2. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 26/08/2017 - 12:57h

Não seria mais fácil percorrer o array com um "for" e exibir somente a comparação com um "if"?
------------------------------------------------------------------------------------------------------------------------
"Esta é a filosofia Unix:
Escreva programas que façam apenas uma coisa mas que façam bem feito.
Escreva programas que trabalhem juntos.
Escreva programas que manipulem streams de texto, pois esta é uma interface universal."
Ou, de maneira simples: "faça apenas uma coisa e faça bem".
------------------------------------------------------------------------------------------------------------------------
Visite: https://blog.gustavovalerio.com
Visite: http://goo.gl/NJlxXy

3. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 26/08/2017 - 13:04h

raserafim escreveu:

como faço para verificar se um determinado valor armazenado em uma variável está contido em um determinado array?

segue um exemplo ilustrativo...:
teste="hotel"

array2=("casa" "apartamento" "hotel" "fazenda" "comércio")

como verificar se o valor "hotel" armazenado na variável "teste" está contido nos valores armazenados na variável array2?

minha intenção é algo semelhante a ....:
if [ $teste in ${array2[@]} ]
then
...
fi
Boa tarde Serafim.
Percorra todo o "array" e compare, exemplo:
teste="fazenda"
for ((x=0;x<${#array2[@]};x++));do
[ "${array2[$x]}" == "$teste" ] && echo "E IGUAL" || echo DIFERENTE
done

DIFERENTE
DIFERENTE
DIFERENTE
E IGUAL
DIFERENTE
Uma outra opção é com o "egrep":
teste="fazenda"
if egrep -q "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi
"fazenda" foi ENCONTRADO

Obs: se a resposta foi satisfatória, marque o tópico como resolvido e escolha a MELHOR RESPOSTA!
Att.:
marcelo oliver

4. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 26/08/2017 - 15:11h

msoliver escreveu:

teste="fazenda"
for ((x=0;x<${#array2[@]};x++));do
[ "${array2[$x]}" == "$teste" ] && echo "E IGUAL" || echo DIFERENTE
done
msoliver, procuro alguma outra solução... uma solução desse tipo, embora deva funcionar, traz uma complicação ao código que "deveria" ser bastante simples...

msoliver escreveu:

if egrep -q "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi
"fazenda" foi ENCONTRADO
essa sugestão é um pouco mais "elegante"... funcionou e não funcionou...

o problema dela é que se o valor da variável "teste", por exemplo, for uma parte de algum valor do array já é retornado como o grep validando...

quando que apenas quando o valor de "teste" coincidir integralmente com alguma linha do array é que deveria ser validado.

no exemplo no meu primeiro post.. se "teste" for "artamen" o grep valida... e não é o que quero.


5. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 26/08/2017 - 18:15h

raserafim escreveu:

msoliver escreveu:

teste="fazenda"
for ((x=0;x<${#array2[@]};x++));do
[ "${array2[$x]}" == "$teste" ] && echo "E IGUAL" || echo DIFERENTE
done
msoliver, procuro alguma outra solução... uma solução desse tipo, embora deva funcionar, traz uma complicação ao código que "deveria" ser bastante simples...

msoliver escreveu:

if egrep -q "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi
"fazenda" foi ENCONTRADO
essa sugestão é um pouco mais "elegante"... funcionou e não funcionou...

o problema dela é que se o valor da variável "teste", por exemplo, for uma parte de algum valor do array já é retornado como o grep validando...

quando que apenas quando o valor de "teste" coincidir integralmente com alguma linha do array é que deveria ser validado.

no exemplo no meu primeiro post.. se "teste" for "artamen" o grep valida... e não é o que quero.

Para o "grep" não validar "artamen", faça da seguinte maneira:
if egrep -qw "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi
Ou
[code]egrep "\bfazenda\b" <<< "${array2[@]}"

Ou
egrep " fazenda " <<< "${array2[@]}"
Das formas citadas acima, vai "casar" somente com a palavra inteira.
Não entendi sua citação:
quando que apenas quando o valor de "teste" coincidir integralmente com alguma linha do array é que deveria ser validado.

MSO

6. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 10:27h

msoliver escreveu:

Não entendi sua citação:
quando que apenas quando o valor de "teste" coincidir integralmente com alguma linha do array é que deveria ser validado.
a redação ficou ruim...confusa...

mas você compreendeu o sentido da frase quando escreveu:
Das formas citadas acima, vai "casar" somente com a palavra inteira.
ou seja, o que quis dizer é que o valor da variável "teste" deve coincidir integralmente ("casar") com alguma linha do array.


7. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 10:32h

msoliver escreveu:

Para o "grep" não validar "artamen", faça da seguinte maneira:
if egrep -qw "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi 
acrescentando o parâmetro "w" ao "q" deu certo!!

obrigado por mais uma, msoliver!

obs: substitui o "egrep" por "grep" e funcionou normalmente. alguma vez li que o egrep está defasado; que é para se utilizar o parâmetro "-e" no grep para que este assuma o funcionamento do egrep... (é bom verificar se essa observação procede mesmo...)

8. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 12:58h

raserafim escreveu:

msoliver escreveu:

Para o "grep" não validar "artamen", faça da seguinte maneira:
if egrep -qw "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi 
acrescentando o parâmetro "w" ao "q" deu certo!!

obrigado por mais uma, msoliver!

obs: substitui o "egrep" por "grep" e funcionou normalmente. alguma vez li que o egrep está defasado; que é para se utilizar o parâmetro "-e" no grep para que este assuma o funcionamento do egrep... (é bom verificar se essa observação procede mesmo...)
Boa tarde Serafim.
O "egrep" é equivalente ao "grep -E"
Ambos com suporte p/ "extended-regexp".
Att.:
MSO

9. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 13:22h

msoliver escreveu:

O "egrep" é equivalente ao "grep -E"
exato!!

verificando o manual ("man") do comando "egrep" diz o seguinte:
"Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.

tradução livre: "A invocação direta como egrep ou fgrep é obsoleta, mas é fornecida para permitir aplicativos históricos que dependem deles para serem executados sem modificações.

10. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 15:45h

raserafim escreveu:

msoliver escreveu:

Para o "grep" não validar "artamen", faça da seguinte maneira:
if egrep -qw "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi 
acrescentando o parâmetro "w" ao "q" deu certo!!

obrigado por mais uma, msoliver!

obs: substitui o "egrep" por "grep" e funcionou normalmente. alguma vez li que o egrep está defasado; que é para se utilizar o parâmetro "-e" no grep para que este assuma o funcionamento do egrep... (é bom verificar se essa observação procede mesmo...)
agora me deparei com um inconveniente...

quando o valor da variável "teste" tem um valor que começa "-" (traço) ou "--" (dois traços), então, uma mensagem de erro é exibida relacionada ao não reconhecimento da opção..

quer dizer, o grep trata o valor da variável "test" como se eu estivesse tentando passar um parâmetro ao grep..

por exemplo: se o valor de "teste" for "--hotel" o seguinte erro será exibido:
grep: unrecognized option '--456'

11. Re: Verificar se um determinado valor está contido em um determinado array?

Enviado em 28/08/2017 - 16:50h

raserafim escreveu:

raserafim escreveu:

msoliver escreveu:

Para o "grep" não validar "artamen", faça da seguinte maneira:
if egrep -qw "$teste" <<< "${array2[@]}";then echo "\"$teste\" foi ENCONTRADO";else echo "$teste não foi ENCONTRADO"; fi 
acrescentando o parâmetro "w" ao "q" deu certo!!

obrigado por mais uma, msoliver!

obs: substitui o "egrep" por "grep" e funcionou normalmente. alguma vez li que o egrep está defasado; que é para se utilizar o parâmetro "-e" no grep para que este assuma o funcionamento do egrep... (é bom verificar se essa observação procede mesmo...)
agora me deparei com um inconveniente...

quando o valor da variável "teste" tem um valor que começa "-" (traço) ou "--" (dois traços), então, uma mensagem de erro é exibida relacionada ao não reconhecimento da opção..

quer dizer, o grep trata o valor da variável "test" como se eu estivesse tentando passar um parâmetro ao grep..

por exemplo: se o valor de "teste" for "--hotel" o seguinte erro será exibido:
grep: unrecognized option '--456'

Boa tarde.
base64 -d <<< "VMOhIEZPREEsIGhlaW0hCg=="
Cada "hora" é uma "tripa solta".
É fácil resolver.....
Escape o "-" da var tst
tst='--Comércio'
tst=$(sed 's/^-/\\-/' <<< "$tst") #Se começa com traço, escapa!
grep -o "$tst" <<< "${array[*]}"

--Comércio
MSO

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder