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

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

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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



  


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

Gustavo Valério
GustavoValerio

(usa Void Linux)

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?

Marcelo Oliver
msoliver

(usa Debian)

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?

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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?

Marcelo Oliver
msoliver

(usa Debian)

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?

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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?

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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?

Marcelo Oliver
msoliver

(usa Debian)

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?

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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?

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

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?

Marcelo Oliver
msoliver

(usa Debian)

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






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts