Case dinamico [RESOLVIDO]

13. Re: Case dinamico [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/02/2017 - 13:59h

Você tem apenas dois casos de seleção. Sendo assim, por que usar case? Seria melhor testar com if, porque as substituições seriam mais diretas.


  


14. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 14:03h

paulo1205 escreveu:

Você tem apenas dois casos de seleção. Sendo assim, por que usar case? Seria melhor testar com if, porque as substituições seriam mais diretas.


to passando em um for, tenho vários casos, aquele array $arquivos pode ter 100 ou apenas 5 casos, por isso preciso de um case dinamico, pois ele irá variar de acordo com a situação.



15. Re: Case dinamico [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/02/2017 - 14:19h

yuttttttt escreveu:

msoliver escreveu:

yuttttttt escreveu:

msoliver escreveu:

yuttttttt escreveu:

Como crio um case dinamico? Já tentei de todas as formas que consegui imaginar, mas não consegui, só ficou a bugar meu codigo de tantos loops.

Preciso criar um case assim:

while true
do

read resposta
case $resposta in
$numero[$i])$comando[$i]
break
;;
*)opção errada
;;
esac

done


esse $numero tem que se o indice de um array ou um array contendo o indice do array, e o $comando os comandos que também é um array.


yuttttttt, bom dia.
Montei um "case dinamico" esses dias, mas, a situação é diferente...
Tenho um script, onde coloco os scrips de teste numa função, e, para evitar que a cada "função" incluída
tivesse que alterar o case, "automatizei" o mesmo.
Se interessar . . .

marcelo oliver


Bom dia, passa ai para eu dar uma olhada, se não servir, as vezes ilumina a mente para criar o que preciso kkkk


Segue . . .
#!/bin/bash
OPCOES=$(echo 'case $1 in';for op in $(egrep -o '^script[0-9]{2}' $0);do echo "$op) $op ;;";done;echo -e '*) AJUDA ;;\nesac')
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
eval $(echo "$OPCOES")
}

AJUDA() {
echo -e "\n$C OPÇÕES DISPONíVEIS:\n\n$(egrep '^script|^#[A-Z]' $0|sed '$!N;s/() {\n/ =>/;s/^\|#\|_/ /g')$F\n"
}

script01() {
echo -e "\nCOMANDOS DO \"script01\"\n"
}
#DESCRIÇÃO_DO SCRIPT_01

script02() {
echo -e "\nCOMANDOS DO \"script02\"\n"
}
#DESCRIÇÃO_DO SCRIPT_02

script03() {
echo -e "\nCOMANDOS DO \"script03\"\n"
}
#DESCRIÇÃO_DO SCRIPT_03

script04() {
echo -e "\nCOMANDOS DO \"script04\"\n"
}
#DESCRIÇÃO_DO SCRIPT_04

script05() {
echo -e "\nCOMANDOS DO \"script05\"\n"
}
#DESCRIÇÃO_DO SCRIPT_05

INICIO $1


marcelo oliver


Tentei e estou recebendo esse erro:
${#arquivos[*]}

    opcoes=$(echo 'conta=0;case $resposta in';for op in ${array_arquivos[@]};do echo "$conta)$conta ;;" let conta=$conta+1;done;echo -e '*) inexistente ;;nesac')

read resposta
eval $(echo "$opcoes")


#erro:
./casedinamico.sh: eval: line 18: erro de sintaxe próximo do `token' não esperado `)'
./casedinamico.sh: eval: line 18: `conta=0;case $resposta in ) ;; let conta=+1 ) ;; let conta=+1 ) ;; let conta=+1 ) ;; let conta=+1 *) inexistente ;; esac'



Como esta "chamando/executando" o casedinamico.sh?


16. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 14:23h

msoliver escreveu:

yuttttttt escreveu:

msoliver escreveu:

yuttttttt escreveu:

msoliver escreveu:

yuttttttt escreveu:

Como crio um case dinamico? Já tentei de todas as formas que consegui imaginar, mas não consegui, só ficou a bugar meu codigo de tantos loops.

Preciso criar um case assim:

while true
do

read resposta
case $resposta in
$numero[$i])$comando[$i]
break
;;
*)opção errada
;;
esac

done


esse $numero tem que se o indice de um array ou um array contendo o indice do array, e o $comando os comandos que também é um array.


yuttttttt, bom dia.
Montei um "case dinamico" esses dias, mas, a situação é diferente...
Tenho um script, onde coloco os scrips de teste numa função, e, para evitar que a cada "função" incluída
tivesse que alterar o case, "automatizei" o mesmo.
Se interessar . . .

marcelo oliver


Bom dia, passa ai para eu dar uma olhada, se não servir, as vezes ilumina a mente para criar o que preciso kkkk


Segue . . .
#!/bin/bash
OPCOES=$(echo 'case $1 in';for op in $(egrep -o '^script[0-9]{2}' $0);do echo "$op) $op ;;";done;echo -e '*) AJUDA ;;\nesac')
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
eval $(echo "$OPCOES")
}

AJUDA() {
echo -e "\n$C OPÇÕES DISPONíVEIS:\n\n$(egrep '^script|^#[A-Z]' $0|sed '$!N;s/() {\n/ =>/;s/^\|#\|_/ /g')$F\n"
}

script01() {
echo -e "\nCOMANDOS DO \"script01\"\n"
}
#DESCRIÇÃO_DO SCRIPT_01

script02() {
echo -e "\nCOMANDOS DO \"script02\"\n"
}
#DESCRIÇÃO_DO SCRIPT_02

script03() {
echo -e "\nCOMANDOS DO \"script03\"\n"
}
#DESCRIÇÃO_DO SCRIPT_03

script04() {
echo -e "\nCOMANDOS DO \"script04\"\n"
}
#DESCRIÇÃO_DO SCRIPT_04

script05() {
echo -e "\nCOMANDOS DO \"script05\"\n"
}
#DESCRIÇÃO_DO SCRIPT_05

INICIO $1


marcelo oliver


Tentei e estou recebendo esse erro:
${#arquivos[*]}

    opcoes=$(echo 'conta=0;case $resposta in';for op in ${array_arquivos[@]};do echo "$conta)$conta ;;" let conta=$conta+1;done;echo -e '*) inexistente ;;nesac')

read resposta
eval $(echo "$opcoes")


#erro:
./casedinamico.sh: eval: line 18: erro de sintaxe próximo do `token' não esperado `)'
./casedinamico.sh: eval: line 18: `conta=0;case $resposta in ) ;; let conta=+1 ) ;; let conta=+1 ) ;; let conta=+1 ) ;; let conta=+1 *) inexistente ;; esac'



Como esta "chamando/executando" o casedinamico.sh?


./casedinamico.sh



17. Re: Case dinamico [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

Enviado em 10/02/2017 - 15:17h

O que o Paulo falou é fato. Não cheguei a sugerir isso pq pensei, inicialmente, que fosse só um exemplo e que você fosse usar diversas opções. Sobre isso de poder ser 100 ou 5 opções, você quer dizer que pode existir isso de opções no case ou que a variável que é usada como opção no case pode ter essa quantidade de valores? Pq se for só isso, use um if mesmo.


18. Re: Case dinamico [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/02/2017 - 15:30h

Funcionou aqui . . .

#!/bin/bash
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; printf "%02d) ls -l %s ;;\n" $n $op ;done;echo -e "*) AJUDA ;;\nesac\n")
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
read -p " ESCOLHA UMA OPÇãO: " resposta
eval $(echo "$CASE")
}

AJUDA() {
echo -e "\n$C OPÇãO INVáLIDA$F\n"
}
INICIO


marcelo oliver


19. Re: Case dinamico

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/02/2017 - 15:32h

yutttttt escreveu:

to passando em um for, tenho vários casos, aquele array $arquivos pode ter 100 ou apenas 5 casos, por isso preciso de um case dinamico, pois ele irá variar de acordo com a situação.


Permita-me discordar.

Você possivelmente quer fazer algo como o seguinte.

#/bin/bash

# ...

unset comando_a_rodar
for ((i=0; i<${#numero[@]}; i++)) do
# A comparação abaixo usa igualdade absoluta. Você pode fazer comparação
# com padrões (como case) ou com regexps, trocando o '=' por '==' ou '=~'.
if [[ "$resposta" = "${numero[$i]}" ]]; then
comando_a_rodar="${comando[$i]}"
break
fi
done
if [[ -n "$comando_a_rodar" ]]; then
$comando_a_rodar
else
echo "Opção errada" >&2
fi

# ...


Mas possivelmente pode ficar mais curto ainda. Se as comparações forem exatas (como acima, usando o comparador “=”, e não “==” nem “=~”), você pode usar arrays associativos em vez de dois arrays lineares, usando as possibilidades válidas de resposta para indexar os comandos correspondentes.

declare -A valor_comando
valor_comando[pera]="echo 1"
valor_comando[uva]="ls -la"
valor_comando[maca]="echo \"Jobs is dead.\""

echo -n "Pera, uva ou maca? "
read resposta
if [[ -n "${valor_comando[$resposta]}" ]]; then
${valor_comando[$resposta]}
else
echo "Opção inválida." >&2
fi



20. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 15:49h

thinomar escreveu:

O que o Paulo falou é fato. Não cheguei a sugerir isso pq pensei, inicialmente, que fosse só um exemplo e que você fosse usar diversas opções. Sobre isso de poder ser 100 ou 5 opções, você quer dizer que pode existir isso de opções no case ou que a variável que é usada como opção no case pode ter essa quantidade de valores? Pq se for só isso, use um if mesmo.


quero que o case seja assim:

case $reposta in
1)
;;
2)
;;
3)
;;
...
100)
;;
*)
;;

ou dependendo da situação apenas:

case $reposta in
1)
;;
2)
;;
3)
;;
*)
;;



21. Re: Case dinamico [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/02/2017 - 16:05h

yuttttttt escreveu:

thinomar escreveu:

O que o Paulo falou é fato. Não cheguei a sugerir isso pq pensei, inicialmente, que fosse só um exemplo e que você fosse usar diversas opções. Sobre isso de poder ser 100 ou 5 opções, você quer dizer que pode existir isso de opções no case ou que a variável que é usada como opção no case pode ter essa quantidade de valores? Pq se for só isso, use um if mesmo.


quero que o case seja assim:

case $reposta in
1)
;;
2)
;;
3)
;;
...
100)
;;
*)
;;

ou dependendo da situação apenas:

case $reposta in
1)
;;
2)
;;
3)
;;
*)
;;


Veja a minha postagem de nº 17 . . .



22. Re: Case dinamico

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 16:41h

msoliver escreveu:

Funcionou aqui . . .

#!/bin/bash
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; printf "%02d) ls -l %s ;;\n" $n $op ;done;echo -e "*) AJUDA ;;\nesac\n")
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
read -p " ESCOLHA UMA OPÇãO: " resposta
eval $(echo "$CASE")
}

AJUDA() {
echo -e "\n$C OPÇãO INVáLIDA$F\n"
}
INICIO


marcelo oliver


Cara assim deu certo, me explique esse %02d, o que é? e também se eu colocar %01d vai para uma casa, e se chegar em 10? como o bash tratará isso?
E não posso usar ls tem que ser o array, pq se não irá interferir em outros problemas.



23. Re: Case dinamico [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/02/2017 - 17:01h

yuttttttt escreveu:

msoliver escreveu:

Funcionou aqui . . .

#!/bin/bash
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; printf "%02d) ls -l %s ;;\n" $n $op ;done;echo -e "*) AJUDA ;;\nesac\n")
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
read -p " ESCOLHA UMA OPÇãO: " resposta
eval $(echo "$CASE")
}

AJUDA() {
echo -e "\n$C OPÇãO INVáLIDA$F\n"
}
INICIO


marcelo oliver


Cara assim deu certo, me explique esse %02d, o que é? e também se eu colocar %01d vai para uma casa, e se chegar em 10? como o bash tratará isso?

Justamente, o printf "%02d" 5
05
Imprime o nº com dois digitos . . .
Para ignorar o Nº de digitos, use o formato %s,
printf "%s" 5
5
SEpreferir, substitua o "printf" pelo "echo":
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; echo "$n) ls -l $op ;;\n";done;echo -e "*) AJUDA ;;\nesac\n") 

Precisando, estou por aqui . . .

Se a resposta foi satisfatória/esclarecedora, . . . MARQUE o tópico como resolvido, e, se gostou da minha "solução", Marque a minha resposta como a melhor . . . . Dessa forma sou pontuado, o que incentiva a continuar compartilhando o conhecimento . . .

Att.:
marcelo oliver.



24. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 17:21h

msoliver escreveu:

yuttttttt escreveu:

msoliver escreveu:

Funcionou aqui . . .

#!/bin/bash
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; printf "%02d) ls -l %s ;;\n" $n $op ;done;echo -e "*) AJUDA ;;\nesac\n")
C="\x1B[0;38;5;156m"
F="\x1B[m"

INICIO() {
read -p " ESCOLHA UMA OPÇãO: " resposta
eval $(echo "$CASE")
}

AJUDA() {
echo -e "\n$C OPÇãO INVáLIDA$F\n"
}
INICIO


marcelo oliver


Cara assim deu certo, me explique esse %02d, o que é? e também se eu colocar %01d vai para uma casa, e se chegar em 10? como o bash tratará isso?

Justamente, o printf "%02d" 5
05
Imprime o nº com dois digitos . . .
Para ignorar o Nº de digitos, use o formato %s,
printf "%s" 5
5
SEpreferir, substitua o "printf" pelo "echo":
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; echo "$n) ls -l $op ;;\n";done;echo -e "*) AJUDA ;;\nesac\n") 

Precisando, estou por aqui . . .

Se a resposta foi satisfatória/esclarecedora, . . . MARQUE o tópico como resolvido, e, se gostou da minha "solução", Marque a minha resposta como a melhor . . . . Dessa forma sou pontuado, o que incentiva a continuar compartilhando o conhecimento . . .

Att.:
marcelo oliver.


Quando mudo para echo e digito 1 por exemplo, recebo esse erro:

./case-dinamico.sh: eval: line 14: erro de sintaxe proximo do `token' não eperado `2'


e preciso que seja echo para eu conseguir percorrer o array no for



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts