Usando o comando 'select' para imprimir um menu no Bash

7

Estou tentando implementar um menu simples usando o comando select . O script (para fins de teste) é o seguinte:

#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
  case $opt in
        "apache")
          date
          ;;
        "named")
          echo "test"
          ;;
        "sendmail")
          echo "test 2"
          ;;
        *) echo "invalid option";;
  esac
done
echo "*********************"

O script não está reconhecendo nenhuma entrada válida que eu forneço e sempre imprime a mensagem "opção inválida". O que estou fazendo de errado neste script?

    
por Sumod 14.09.2011 / 14:38

2 respostas

9

Seu menu exibido por seleção será parecido com:

1) apache
2) named
3) sendmail
Select an option and press Enter: 

Neste momento, você digita "1" ou "2" ou "3": você não digita a palavra.

Além disso, select fará um loop até ver um comando break , então você quer isso:

  case $opt in
        "apache")
          date
          break
          ;;
        "named")
          echo "test"
          break
          ;;
        "sendmail")
          echo "test 2"
          break
          ;;
        *) echo "invalid option";;
  esac

Se você quiser permitir que o usuário insira o número ou a palavra, escreva:

select opt in "${options[@]}"; do
  case "$opt,$REPLY" in
    apache,*|*,apache)     do_something; break ;;
    named,*|*,named)       do_something; break ;;
    sendmail,*|*,sendmail) do_something; break ;;
  esac
done

A vírgula não tem significado sintático, ela está lá para ser capaz de combinar padrões na variável $ REPLY (que é o que o usuário realmente digitou) ou na variável $ opt

    
por 14.09.2011 / 19:26
3

Sua variável $opt será configurada para a palavra da opção correspondente ao número que o usuário insere. Se você quiser ver o que o usuário realmente digitou, veja $REPLY .

    
por 14.09.2011 / 15:44