bash .sh script loop em vez de terminar / sair

0

Estou escrevendo meu primeiro script bash. Toda vez que eu corri para ter certeza de que funciona, tudo funciona exatamente como eu gostaria, com exceção do comando done no final. Em vez disso, ele volta à pergunta perguntando ao usuário se ele tem certeza de que quer autorizá-lo para fazer as alterações que ele fará.

Como esta é a primeira vez que escrevo um roteiro, tenho certeza de que há maneiras melhores e mais eficientes de executar a ação que escrevi para fazer, por isso não estou pedindo informações a esse respeito. O fato de que ele faz o que eu gostaria de fazer (mesmo que não pareça terminar), é bom o suficiente para mim neste momento.

Aqui está o script (qualquer coisa que você veja [with backets] é algo que incluí apenas para este SU: Pergunta, e não, na verdade, no próprio script):

#!/bin/bash

perl -e 'print "\n"x128;'

echo ' ' ; echo ' ' ; 

echo    "


[Omitted to make this SU:Question shorter]

    ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓

    TLDR the above info?
    That's okay, it is also available in the included README.

            ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓
    "

[This does not do anything, just something neat I learned how to do...]

    c=3 # seconds to wait
    REWRITE="\e[25D\e[1A\e[K"
    echo "    First thing first... I'll need you have run this as ROOT/SU..."
    while [ $c -gt 0 ]; do 
        c=$((c-1))
        sleep 1
        #echo -e "  ${REWRITE}$c"
    done

    echo ' '



 if [ $(id -u) != 0 ]; then
     echo "    Oops, you didn't run this as ROOT or SU! Here is the proper command:

    ⟹   sudo ./enable-wifi.sh   ⟸

            "
    exit
     # elevate script privileges

     else
        echo "    ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓

    Awesome, you're ready!"


 fi

while true; do
    read -p "
    Just to make sure...  Do you wish to execute this script?

    Please enter [Y/y] / [N/n] here:  " yn 
    case $yn in
        [Yy]* ) sudo modprobe -r acer-wmi ; sudo rfkill unblock all ; echo "blacklist acer_wmi" | sudo tee /etc/modprobe.d/acer-wmi.conf ; clear ; echo ' ' ; echo ' ' ; echo 'DONE!' ; echo ' ' ; echo ' ' ; echo 'The WIFI Card should be working now!' ; echo ' ' ; echo ' ';;
        [Nn]* ) echo ' ' ; echo '    ⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓⁓

    You have decided to cancel, this script will end immediately 
    without making any changes to your HP Envy x360.!

    '  ; exit;;
#        * ) echo "Please answer yes or no.";;
    esac


done

Muito obrigado por dar uma olhada nesta questão e me ajudar!

~ Ev

    
por Ev- 11.07.2017 / 02:38

1 resposta

1

with the exception of the done command

done não é um comando.

Parece haver um mal-entendido: a palavra-chave done não significa que o script está pronto e pode terminar a execução. Em vez disso, é a contraparte da palavra-chave anterior do no while...do . Isso significa: quando a condição while é falsa, execute a próxima instrução após a palavra-chave done .

Talvez você queira adicionar um exit no final da lista de comandos executados se o usuário escolher Y .

Atualização:

Mencionei exit simplesmente porque ele já era usado na ramificação [Nn] , mas isso só teria corrigido o script. Usar break em vez de exit como sugerido por Gordon Davisson é uma ideia melhor que representa um melhoria , permitindo um maior desenvolvimento do roteiro.

    
por 12.07.2017 / 16:05