Selecione (loop) ou o comando não está funcionando no shell script [duplicado]

0

Eu venho mexendo com Linux e Unix há anos, mas ainda sou um novato em mente e recentemente me vejo tentando ser mais profissional com isso enquanto trabalho na área de TI. Então, com essa noção, estou estudando scripts de shell.

Eu acertei um problema no Ubuntu usando a última versão 13.10 Saucy. Quando eu uso o comando select em um script sh ele não funciona, dependendo de como eu formatar o comando, ele retornará "do" inesperado ou "done" inesperado. Veja os dois exemplos a seguir:

Esta seção do código produz um erro "do" inesperado:

#/bin/bash
PS3='Please enter your choice'
select opt in option1 option2 option3 quit
do
     case $opt in
       "option1")
            echo "you chose choice 1" ;;
        "option2")
            echo "you chose choice 2" ;;
        "option3")
            echo "you chose choice 3" ;;
        "quit")
            break ;;
        *) echo invalid option ;;
    esac
done

Esta seção do código produz um erro "concluído" inesperado.

#/bin/bash
PS3='Please enter your choice'
select opt in option1 option2 option3 quit ; do
     case $opt in
       "Option1")
            echo "you chose choice 1" ;;
        "Option2")
            echo "you chose choice 2" ;;
        "Option3")
            echo "you chose choice 3" ;;
        "quit")
            break ;;
        *) echo invalid option ;;
    esac
done

Quando insiro esses parâmetros na linha de comando, de forma interativa ou manual, obtenho o resultado desejado, que é uma lista de opções para escolher. No entanto, quando executado a partir de um script, recebo os erros mencionados anteriormente. Também uma nota de lado eu tentei isso no Fedora como um script e funcionou perfeitamente! Existe algo que eu preciso fazer de forma diferente ou uma configuração em um arquivo de configuração que preciso verificar? Eu sou o único que tem esse problema?

    
por Keith Gregory 27.10.2013 / 00:08

1 resposta

1

Os erros Syntax error: "do" unexpected ou Syntax error: "done" unexpected são quase certamente porque você está tentando executar seu script digitando

sh yourscript

que substitui a diretiva #!/bin/bash e força o script a ser executado no interpretador / bin / sh - que, por padrão, é um link simbólico para / bin / dash, que não suporta a sintaxe select . Você deve apenas tornar o script executável

chmod +x yourscript

e, em seguida, invoque-o como

./yourscript

O outro problema óbvio é que sua lista de opções usa letras minúsculas option1 option2 option3 , mas sua instrução case testa por Option1 Option2 Option3 - deve ser

#/bin/bash
PS3='Please enter your choice '
select opt in option1 option2 option3 quit; do
     case "$opt" in
       "option1")
            echo "you chose choice 1" ;;
       "option2")
            echo "you chose choice 2" ;;
       "option3")
            echo "you chose choice 3" ;;
       "quit")
            break ;;
       *) echo invalid option ;;
    esac
done
    
por steeldriver 27.10.2013 / 01:45