zapętlanie skryptu bash .sh zamiast kończenia / zamykania

0

Piszę swój pierwszy skrypt basha. Za każdym razem, gdy go uruchomię, aby upewnić się, że działa, wszystko działa dokładnie tak, jak chciałbym, z wyjątkiem done polecenie na samym końcu. Zamiast tego zapętla się do pytania z pytaniem użytkownika, czy są pewni, że chcą autoryzować go do wprowadzenia zmian.

Ponieważ po raz pierwszy piszę skrypt, jestem pewien, że istnieją lepsze, bardziej efektywne sposoby wykonywania akcji, które napisałem, więc nie proszę o wkład w tym zakresie. Fakt, że robi to, co chciałbym zrobić (nawet jeśli wydaje się, że nie ma końca), jest dla mnie wystarczająco dobry w tym momencie.

Oto skrypt (wszystko, co widzisz [with backets] to coś, co załączyłem tylko dla tego SU: Pytanie, a nie w samym skrypcie):

#!/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

Bardzo dziękuję za obejrzenie tego pytania i pomoc!

~ Ev

Ev-
źródło
2
Cóż, czego się spodziewałeś? while true; do oznacza „rób to na zawsze”; nie ma możliwości zakończenia pętli, chyba że przez exit dzieje się tak, jeśli użytkownik wprowadzi „Nie”.
Scott

Odpowiedzi:

1

z wyjątkiem done dowództwo

done nie jest poleceniem.

Wydaje się, że istnieje nieporozumienie: słowo kluczowe done nie oznacza, że ​​skrypt został wykonany i może zakończyć wykonywanie. Zamiast tego jest odpowiednikiem poprzedniego do słowo kluczowe w while...do. Oznacza to: kiedy while warunek jest fałszywy, wykonaj następną instrukcję po done słowo kluczowe.

Może chcesz dodać exit na końcu listy poleceń, które zostaną wykonane, jeśli użytkownik wybierze Y.

Aktualizacja:

wspomniałem exit po prostu dlatego, że był już używany w [Nn] oddział, ale to miałoby tylko naprawiony scenariusz. Za pomocą break zamiast exit jak zasugerował Gordon Davisson jest to lepszy pomysł, który reprezentuje poprawa , pozwalające na dalszy rozwój skryptu.

simlev
źródło
1
Za pomocą break (zamiast exit ) też by działało - to sprawiłoby, że będzie kontynuowane po zakończeniu pętli ( done słowo kluczowe), więc jeśli byłby skrypt, który zostałby wykonany.
Gordon Davisson