VETOR (ACL) + CASE {DUVIDA} [RESOLVIDO]

1. VETOR (ACL) + CASE {DUVIDA} [RESOLVIDO]

Linx Debian
linxdb

(usa Debian)

Enviado em 10/10/2016 - 10:38h

Bom dia.

Estou com um problema e gostaria de ajuda da comunidade.

Estou fazendo um algoritmo e cheguei a um ponto onde preciso usar um vetor com posições aleatórias (10, 7) dentro de um case.

É uma espécie de menu com um número de termos aleatório, ou seja, tenho um variável ao qual o usuário escreve "7, 8, 9" e preciso que essa variável seja testada quanto a existência desse número dentro de cada posição do vetor.
Mais ou menos:

ventor=("1" "2" "3" "4" "5" "6" "7" "8" "9'")
cont=0
while cont<1
do
read menu
case $menu in

${vetor[menu]})
echo "VALOR CONTIDO DENTRO DO VETOR, AGORA CONTINUA O ALGORITMO PARA A OPÇÃO ESCOLHIDA"
cont=1
;;

*)
echo "VALOR NÃO EXISTE NO VETOR"
;;
esac
done

Espero que tenham compreendido minha dúvida, o algoritmo que fiz acima não funcionou pra função desejada.

Qualquer dúvida estou a disposição.

GRACIAS!!!!


  


2. Re: VETOR (ACL) + CASE {DUVIDA}

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 10/10/2016 - 11:04h

Faça assim, pegue o tamanho do vetor com os resultados e depois compara cada um com 7, 8, 9. Minha dúvida é quantos valores terá esse vetor? Segue como ficaria.

Onde ${#vetor[*]} é o tamanho total de posições do vetor;
#!/bin/bash

vetor=("1" "2" "3" "4" "5" "6" "7" "8" "9" "0")

for((numero=0; numero < ${#vetor[*]}; numero++)); do
case ${vetor[$numero]} in
7) echo "numero 7 presente no vetor";;
8) echo "numero 8 presente no vetor";;
9) echo "numero 9 presente no vetor";;
*) ;;
esac
done







______________________________________________________________________
OS: Kali Linux kali-rolling kali-rolling
Kernel: x86_64 Linux 4.6.0-kali1-amd64
Resolution: 2390x768
CPU: Intel Core i3-4005U CPU @ 1.7GHz
RAM: 3852MiB


3. Re: VETOR (ACL) + CASE {DUVIDA} [RESOLVIDO]

Linx Debian
linxdb

(usa Debian)

Enviado em 10/10/2016 - 11:15h

ctw6av, obrigado pela resposta.

Legal, gostei do for com o uso incremental em um comando só, fica muito mais limpo.

Na verdade desta forma como me enviaste funciona considerando que o "vetor" tenha sempre os mesmo valores, 0 a 9.

Mas no meu caso prático terei valores diferentes, com valores variáveis de 0 a 60 mais ou menos, entende?

Por exemplo para um caso o vetor será de 0 a 9 em outro de 0 a 20 em outro de 0 a 15, entende?

Nesse caso o "case" hora deverá testar um número x de termos, hora um número y de termos.



4. Re: VETOR (ACL) + CASE {DUVIDA}

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 10/10/2016 - 11:21h

Nesse caso é melhor ainda, não altere nada no código e altere somente o vetor, a quantidade de valores não importa, veja um caso com 100 valores:

 #!/bin/bash

vetor=("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" \
"21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" \
"41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" \
"61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" \
"81" "82" "83" "84" "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96" "97" "98" "99")

for((numero=0; numero < ${#vetor[*]}; numero++)); do
case ${vetor[$numero]} in
7) echo "numero 7 presente no vetor";;
8) echo "numero 8 presente no vetor";;
9) echo "numero 9 presente no vetor";;
*) ;;
esac
done







______________________________________________________________________
OS: Kali Linux kali-rolling kali-rolling
Kernel: x86_64 Linux 4.6.0-kali1-amd64
Resolution: 2390x768
CPU: Intel Core i3-4005U CPU @ 1.7GHz
RAM: 3852MiB


5. Re: VETOR (ACL) + CASE {DUVIDA} [RESOLVIDO]

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 10/10/2016 - 11:35h

Desculpe cometi um erro nos códigos acima mas já concertei.



6. Re re re re

Linx Debian
linxdb

(usa Debian)

Enviado em 10/10/2016 - 12:03h

Seguinte, acho que me expressei errado.

No caso do teu algoritmo, tu só testa se o valor está ali ou não.

Imagina um menu que pega o numero de partições:

[1] PARTICAO 1
[2] PARTICAO 2
[3] PARTICAO 3
[4] PARTICAO 4
[5] PARTICAO 5
[6] PARTICAO 6
[x] PARTICAO X


O numero de partições é relativo ao número de HDs e sistemas instalados.
Dai o usuário escolhe qual PARTIÇÃO ele quer.

Por exemplo a PARTIÇÃO X

Dai preciso testar esse número.
pra ver se é igual a algum número dentro do vetor.

então eu tenho o vetor [ de x valores]
e a entrada do usuário [1 valor que quero saber se está dentro do vetor]
se o valor estiver dentro do vetor vou usar ele dentro do case como "vetor[entrada do usuário]" + comandos que preciso pro meu algoritmo...
Se o número não estiver dentro do vetor o usuário deve digitar a entrada novamente.

Poderia usar o teu algoritmo pra resolver sim, porém, preciso cadastrar uma "resposta" para cada vetor no case, considerando um número máximo de opões.

Vamos pegar 2 exemplos diferentes para avaliar.

Ex:1 eu tenho 4 hd's com 8 partições cada.
com o total de 32 (4*8) opções no menu, ok?
Vamos considerar como se este fosse o máximo de partições que um computador pudesse ter.....

Agora no exemplo dois eu tenho apenas 2 hd's com 8 partições cada.
com um total de 16 opções no menu,ok?

Para usar o mesmo algoritmo para os dois exemplos eu preciso ter as 32 linhas do "case" digitadas no algoritmo para os 32 testes, independente do vetor ter apenas 16 termos para que funcione em ambos os casos.

Minha duvida é se existe uma maneira genérica de fazer esse teste vou realmente precisar passar de 1 por 1 e digitar um comando para cada linha de teste do "case".

Espero ter expressado minha ideia de maneira concisa e clara.

Abraços e novamente obrigado pela ajuda.


7. Re: VETOR (ACL) + CASE {DUVIDA}

Jeffersson Abreu
ctw6av

(usa Nenhuma)

Enviado em 10/10/2016 - 13:14h

Se for levar em conta todas as partições sem saber a quantidade delas em cada hd e mostrar todas permitindo a escolha livre do usuário ficaria mais ou menos assim:

Execute como root pois o fdisk é um comando administrativo!
#!/bin/bash

#Vetor com as partições
readarray -t part < <(fdisk -l | egrep '^/dev' | awk '{print $1}')

function check(){

clear
# Imprime as partições
printf "###########################################\n"
for((numero=0; numero < ${#part[*]}; numero++)); do
printf "[$numero] - ${part[$numero]}\n"
done
printf "###########################################\n\n"

read -p "escolha uma opção [0-$((${#part[*]} - 1))]: " resp

# Checa se o valor dado pelo usuário é válido
if [[ $resp -lt ${#part[*]} ]] && [[ $resp -ge 0 ]]; then
if [[ $resp = ?(+|-)+([0-9]) ]]; then
printf "\b${part[resp]}\n\n"

#< COLOEQUE SEUS COMANDO E FUNÇÕES AQUI APONTANDO PARA A ESCOLHA "${part[resp]}" >

else
check
fi
else
check
fi
}

# Chamando a função que comanda a escolha
check


Independente da quantidade de partições a saída será:

###########################################
[0] - /dev/sda1
[1] - /dev/sda2
[2] - /dev/sda3
###########################################

escolha uma opção [0-2]:






______________________________________________________________________
OS: Kali Linux kali-rolling kali-rolling
Kernel: x86_64 Linux 4.6.0-kali1-amd64
Resolution: 2390x768
CPU: Intel Core i3-4005U CPU @ 1.7GHz
RAM: 3852MiB


8. re re re re re

Linx Debian
linxdb

(usa Debian)

Enviado em 10/10/2016 - 16:29h

Cara, agradeço muito a ajuda!!!

Acredito que seja isso mesmo.

Eu ainda não testei, existem comandos que eu não conhecia (sou bem novato) e quero entender eles melhor.

Mas de qualquer forma agora é comigo!!!! Obrigado, tu é phoda man!!!!
abrass


9. Feito carreto

Linx Debian
linxdb

(usa Debian)

Enviado em 10/10/2016 - 16:38h

FEITO O CARRETO!!!!!!

Era isso mesmo...

Ele ficou BEM LENTO na leitura do primeiro comando, mas vou otimizar o cara aqui e acredito que era isso.

Gracias novamente.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts