Erro inesperado de EOF e sintaxe

9

Atualmente, estou escrevendo meu terceiro script shell e me deparei com um problema. Este é o meu script até agora:

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

quando tento executar o script, ele diz isso:

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

O que estou fazendo de errado?

    
por Swifty124 02.10.2014 / 14:49

4 respostas

5

O problema é que sua instrução case está faltando o assunto - a variável que deve ser avaliada. Daí você provavelmente quer algo assim:

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

Aqui case usa a variável padrão $REPLY , que read preenche quando não é fornecido nenhum nome de variável (consulte help read para obter detalhes).

Observe também as alterações: printf é usado para exibir o prompt em cada rodada (e não acrescenta uma nova linha), cat é usado para imprimir instruções em várias linhas para que elas não sejam agrupadas e sejam mais fácil de ler.

    
por 02.10.2014 / 15:24
6

Não vamos esquecer select :

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done
    
por 02.10.2014 / 19:25
2

Vamos tentar um único caso inicialmente. Usarei read -p para ler a entrada do usuário em uma variável opt , seguida da instrução case, conforme abaixo.

   
#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

O script acima funciona bem e agora, eu acredito que você precisa tê-lo em um loop para que você possa ler a entrada do usuário até que o usuário pressione a opção 4.

Então, poderíamos fazer isso com um loop while , conforme abaixo. Eu defino a variável opt com o valor inicial como 0. Agora, estou interagindo no loop while desde que a variável opt tenha um valor como 0 (é por isso que eu reconfixo a variável opt como 0 no final da instrução case ).

   
#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done
    
por 02.10.2014 / 14:58
0

Eu colocaria pessoalmente o "while" no começo do código. Se você segui-lo com um : , ele permitirá que ele seja repetido quantas vezes desejar. É assim que eu escrevia.

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

faça as perguntas e termine com

esac
done
    
por 02.10.2014 / 14:57