Case dinamico [RESOLVIDO]

1. Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 09/02/2017 - 19:15h

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.


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

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

yuttttttt escreveu:

msoliver escreveu:

yuttttttt escreveu:

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


Segue alteração com o "echo"
CASE=$(n=0;echo 'case $resposta in' ;for op in $(ls -1);do let n++; echo "$n) echo -e \" A OPÇãO ESCOLHIDA, é: $n\n\" ;;";done;echo -e "*) AJUDA ;;\nesac\n") 



Consegui agora percorrer o array e deu tudo certo, valeu pela ajuda, tava morrendo de tanto procurar como fazer isso já kkkk.
Só mais uma coisa,
01 porque tenho que colocar \""\ antes da variável para funcionar?
02 o que é isso?
03 e o eval faz exatamente o que?
dei uma pesquisada e li que eval tem que ser cuidadosamente utilizado para não causar problemas de segurança,
04 que falhas de segurança poderiam ocorrer pelo uso do eval?


Cara, era só mais "UMA" coisa, foram 04 . . . . . Rsrsrsrsrsr
01- uso o \$ é necessario, neste caso para que a VAR não seja resolvida nesse "echo", do mesmo modo, no 1º echo da var CASE usei aspa simples . . . .
02 - A "\" é usada para "escapar" o caracter, para que o mesmo seja interpretado literalmente
03 - Exemplo do eval:
echo "echo -e \" Se nao usar o eval, o 2º \"echo\" não é EXECUTADO\n MULTIPLICAÇãO:\n 5 x 5 = \$((5*5))\"" 

echo -e " Se nao usar o eval, o 2º "echo" não é EXECUTADO\n MULTIPLICAÇãO:\n 5 x 5 = $((5*5))"

eval $(echo "echo -e \" Se nao usar o eval, o 2º \"echo\" não é EXECUTADO\n MULTIPLICAÇãO:\n 5 x 5 = \$((5*5))\"") 

Se nao usar o eval, o 2º echo não é EXECUTADO
MULTIPLICAÇãO:
5 x 5 = 25



4 - Qquer comando utilizado erroneamente, pode causar danos . . .

Só uma "coisinha" . . . .
Marque a resposta como a melhor....


marcelo oliver




3. Re: Case dinamico [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 10/02/2017 - 11:20h

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







4. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 12:20h

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



5. Re: Case dinamico

thinomar
thinomar

(usa Linux Mint)

Enviado em 10/02/2017 - 12:51h

while true
do
read resposta
case $resposta in
${numero[$i]})
echo "$comando[$i]"
break
;;
*)
echo "opção errada"
i=$((i+1))
;;
esac
done


Se não der certo, troque isso:
case $resposta in
${numero[$i]})

Por isso:
case $resposta in
$(echo ${numero[$i]}))


Se nada der certo, em última instância vc pode usar o eval.


6. Re: Case dinamico

yuttttttt
yuttttttt

(usa Outra)

Enviado em 10/02/2017 - 12:54h

thinomar escreveu:

while true
do
read resposta
case $resposta in
${numero[$i]})
echo "$comando[$i]"
break
;;
*)
echo "opção errada"
i=$((i+1))
;;
esac
done


Se não der certo, troque isso:
case $resposta in
${numero[$i]})

Por isso:
case $resposta in
$(echo ${numero[$i]}))


Se nada der certo, em última instância vc pode usar o eval.


Já tentei com eval, não deu certo. Vou tentar assim, mas creio q n vai dar certo. E não entendi sua lógica.




7. Re: Case dinamico [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

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

Está dando alguma mensagem de erro? Se sim, qual?


8. Re: Case dinamico

yuttttttt
yuttttttt

(usa Outra)

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

thinomar escreveu:

Está dando alguma mensagem de erro? Se sim, qual?



Tentei assim:

arquivos=($(pwd)/*.txt)

IFS="|"
for((i = 0; i < ${#arquivos[*]}; i++))
do

lista_arquivos+="${arquivos[$i]}"
num+="$i"

done

read resposta
eval "case \"$resposta\" in
$num)$lista_arquivos
;;
*) echo "Opcao inexistente!"
;;
esac"


o erro que dá é:

eval: line 33: erro de sintaxe próximo do `token' não esperado `)'


9. Re: Case dinamico

Marcelo Oliver
msoliver

(usa Debian)

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

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



10. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

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

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:


    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'




11. Re: Case dinamico [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

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

Qual interpretador vc tá usando na linha de shebang? sh? Se não for algo muito específico, mude para o bash, pois aqui está tudo funcionando normalmente, sem precisar do eval.
#!/bin/bash 



12. Re: Case dinamico [RESOLVIDO]

yuttttttt
yuttttttt

(usa Outra)

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

thinomar escreveu:

Qual interpretador vc tá usando na linha de shebang? sh? Se não for algo muito específico, mude para o bash, pois aqui está tudo funcionando normalmente, sem precisar do eval.
#!/bin/bash 


to usando o bash



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts