Bash Script – SELECT
“select” em bash é uma construção muito parecida com um loop. No entanto o select necessita que o utilizador escolha de entre os valores possíveis, um valor.
A necessidade de o utilizador escolher a opção pretendida é a parte digamos que destinge o select de os outros loops for/while/etc.
Hoje na continuação dos meus artigos sobre Bash Script, vou descrever de forma simples, como é o propósito destes artigos em bash. Tornar possível qualquer pessoa, entender pequenos pormenores e os possam usar em algo mais sofisticado no futuro.
O select permite contruir um menu com as opções passadas ao comando, apresentar as opões e pedir ao utilizador para escolher a opção pretendida.
Esta é a sintaxe do select:
select option in $optins_list;
do
Fazer algo com a opcão escolhida.
done
Basicamente o comando usa as palavras que são passadas através de optins_list e constrói a lista de opções com um numero que representa cada opção. E coloca na variável option a palavra que o utilizador escolheu entre as possíveis na lista.
Quando queremos capturar o valor que foi escrito, podemos usar a variável "REPLY
“, pois esta variável guarda o ultimo valor que o utilizador escreveu. Que pode ser usada por exemplo, quando o utilizador escreve algo que não está associado a nenhuma opção no menu ou se necessitarmos saber o numero da opção que foi escolhido.
“option” “$optins_list” podem claro, ter nomes diferentes para se adaptar ao que o script faz.
As palavras da “$optins_list” podem vir de uma variável com uma lista de palavras ou pode ser construida com o resultado de outros comandos e passada ao select.
O select usa como separador de palavras o espaço, como é o defeito no bash. No entanto podemos usar a variável “IFS” para que seja possível criar menus com opções com múltiplas palavras por opção. Como irei demonstrar nos exemplos. Neste artigo encontra mais informação sobre a variável IFS.
O select usa o valor da variável PS3, para construir a mensagem que apresenta quando pede para selecionarmos o opção pretendida. Por defeito é apresentado estes caracteres “#?”. No entanto podemos personalizar esta mensagem para se adequar melhor ao propósito dos nossos scripts.
Sempre que selecionamos uma opção o select volta a construir novamente o menu para que possamos escolher novamente outra opção. Isto pode ser ou não o que pretendemos. No entanto se pretendermos sair do select, devemos reservar uma palavra que permita o utilizador selecionar essa opção para terminar. Neste caso devemos usar o comando “break” que faz com que o select termine.
Exemplos
Para exemplo, vou construir um menu que permitia lidar com certificados. No entanto, a parte funcional em relação aos certificados não será desenvolvida. Pois este artigo basicamente pretende demonstrar a utilização do comando select. Mas como tenho que escolher algum tema para os exemplos vou simular que seria o menu para administrar certificados, mas apenas irá escrever as opções no terminal.
Os scripts de exemplo podem ser descarregados do ZIP que anexo a este artigo.
#!/bin/bash
# Lista de nomes que pretendemos listar como opções
optins_list='Criar Atualizar Verificar Sair'
select option in $optins_list; do
# Esta opção vai nos permitir sair do menu, quando escolhemos a opção "Sair"
if [[ $option == 'Sair' ]]; then
echo Foi selecionada a opção: $option
break
fi
# Aqui escrevemos no terminal a opção selecionada
echo Foi selecionada a opção: $option
done
Ao corrermos o script “select_ex_1.sh” o seguinte output é gerado:
miguel@terra:~/bash/select$ ./select_ex_1.sh
1) Criar
2) Atualizar
3) Verificar
4) Sair
#? 1
Foi selecionada a opção: Criar
#? 2
Foi selecionada a opção: Actualizar
#? 3
Foi selecionada a opção: Verificar
#? 4
Foi selecionada a opção: Sair
miguel@terra:~/bash/select$
Como podemos ver no resultado do comando é nos apresentado os caracteres “#?” quando nos pede para inserirmos uma opção. Para podermos personalizar esta mensagem usamos a variável PS3.
#!/bin/bash
# Lista de nomes que pretendemos listar como opções
optins_list='Criar Atualizar Verificar Sair'
# Personalizar o prompt, frase apresentada pelo select ao pedir para inserirmos a opção
PS3='Insira o numero correspondente à opção desejada: '
select option in $optins_list; do
# Esta opção vai nos permitir sair do menu, quando escolhemos a opção "Sair"
if [[ $option == 'Sair' ]]; then
echo Foi selecionada a opção: $option
break
fi
# Aqui escrevemos no terminal a opção selecionada
echo Foi selecionada a opção: $option
done
Quando criamos a variável PS3, com a frase que pretendemos que o select apresente quando nos pede para inserirmos o numero correspondente à opção pretendida, o resultado do comando é o seguinte:
miguel@terra:~/bash/select$ ./select_ex_2.sh
1) Criar
2) Atualizar
3) Verificar
4) Sair
Insira o numero correspondente à opção desejada: 1
Foi selecionada a opção: Criar
Insira o numero correspondente à opção desejada: 2
Foi selecionada a opção: Atualizar
Insira o numero correspondente à opção desejada: 3
Foi selecionada a opção: Verificar
Insira o numero correspondente à opção desejada: 4
Foi selecionada a opção: Sair
miguel@terra:~/bash/select$
Para sabermos o que o utilizador digitou, a fim de fazer algum tipo de verificação podemos usar a variável “REPLY”. Que contem o que foi digitado a ultima vez pelo utilizador.
#!/bin/bash
# Lista de nomes que pretendemos listar como opções
optins_list='Criar Atualizar Verificar Sair'
# Personalizar o prompt, frase apresentada pelo select ao pedir para inserirmos a opção
PS3='Insira o numero correspondente à opção desejada: '
select option in $optins_list; do
# Esta opção vai nos permitir sair do menu, quando escolhemos a opção "Sair"
if [[ $option == 'Sair' ]]; then
echo Foi selecionada a opção: $option
break
fi
# Escrever o que foi inserido pelo utilizador
echo repley: $REPLY
# Aqui escrevemos no terminal a opção selecionada
echo Foi selecionada a opção: $option
done
No seguinte output a variável REPLY mostra tudo o que o utilizador digitou, quer as opções corretas quer incorretas. Poderíamos usar esta variável para algum fim, testar por exemplo se a opção é válida.
miguel@terra:~/bash/select$ ./select_ex_3.sh
1) Criar
2) Atualizar
3) Verificar
4) Sair
Insira o numero correspondente à opção desejada: g
repley: g
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: d
repley: d
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: s
repley: s
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: f
repley: f
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: g
repley: g
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: w
repley: w
Foi selecionada a opção:
Insira o numero correspondente à opção desejada: 4
Foi selecionada a opção: Sair
miguel@terra:~/bash/select$
Por ultimo exemplo, neste artigo referente ao select em BASH, vou apresentar a forma de construir menus com opções com múltiplas palavras. Vou fazer uso da da variável “IFS” para que o select use o sinal “+” como separados para construir o menu de opções. Neste artigo encontra mais informação sobre a variável IFS é importante ler este artigo que descrevo melhor a variável IFS.
É importante, sempre que modificarmos a variável IFS para que um determinado comando use um separador de palavras diferente do normal, que é o espaço, repor logo de seguida o valor da variável IFS para que os outros comandos possam usar o valor por defeito. Para esta razão eu irei modificar a variável IFS antes da contrução select, e repor o valor para espaço logo depois da contrução select.
Desta forma um script com mais código, poderia ler de forma normal as palavras. A não ser que o script use para tudo o separador personalizado.
Como podemos ver no código abaixo a variável “optins_list” foi preenchida com as opções separadas com o sinal “+”, pois pretendemos que as opções sejam separadas pelo sinal de “+” e não pelo espaço que separa as várias palavras de uma opção.
#!/bin/bash
# Lista de nomes que pretendemos listar como opções
optins_list='Criar certificado+Atualizar Certificado+Verificar Certificado+Sair'
# Personalizar o prompt, frase apresentada pelo select ao pedir para inserirmos a opção
PS3='Insira o numero correspondente à opção desejada: '
# Guardar o valor por defeito da variável IFS.
OLDIFS=$IFS
# Configurar o BASH para usar o sinal '+' como separador
# desta forma podemos separar as opções com o sinal '+'
IFS='+'
select option in $optins_list; do
# Esta opção vai nos permitir sair do menu, quando escolhemos a opção "Sair"
if [[ $option == 'Sair' ]]; then
echo Foi selecionada a opção: $option
break
fi
# Aqui escrevemos no terminal a opção selecionada
echo Foi selecionada a opção: $option
done
# Como já temos os nossos dados organizados podemos repor o valor da variável IFS
# com o seu valor por defeito para usar no resto do script.
IFS=$OLDIFS
Quando corrermos o script, vemos que nos é apresentado as opções de menu com mais de uma palavra como é o pretendido neste exemplo:
miguel@terra:~/bash/select$ ./select_ex_4.sh
1) Criar certificado 3) Verificar Certificado
2) Atualizar Certificado 4) Sair
Insira o numero correspondente à opção desejada: 1
Foi selecionada a opção: Criar certificado
Insira o numero correspondente à opção desejada: 2
Foi selecionada a opção: Atualizar Certificado
Insira o numero correspondente à opção desejada: 3
Foi selecionada a opção: Verificar Certificado
Insira o numero correspondente à opção desejada: 4
Foi selecionada a opção: Sair
miguel@terra:~/bash/select$
Conclusão
O comando select é importante quando pretendemos pedir ao utilizador para selecionar uma opção entre varias.
Podemos usar o select em scripts, para por exemplo configurar um determinado programa onde vamos pedindo ao utilizador que vá escolhendo as opções. Podemos usar vários select. Podemos usar como nestes exemplos nos scripts que fazem varias ações no entanto todas em relação ao mesmo tema, que neste caso Administrar Certificados.
O use do select vai depender das necessidades que temos e da imaginação ao criar os menus.
Este artigo destina se a descrever de forma simples e compreensível a construção select em BASH.