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
while true; do
oznacza „rób to na zawsze”; nie ma możliwości zakończenia pętli, chyba że przezexit
dzieje się tak, jeśli użytkownik wprowadzi „Nie”.Odpowiedzi:
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 poprzedniegodo
słowo kluczowe wwhile...do
. Oznacza to: kiedywhile
warunek jest fałszywy, wykonaj następną instrukcję podone
słowo kluczowe.Może chcesz dodać
exit
na końcu listy poleceń, które zostaną wykonane, jeśli użytkownik wybierzeY
.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
zamiastexit
jak zasugerował Gordon Davisson jest to lepszy pomysł, który reprezentuje poprawa , pozwalające na dalszy rozwój skryptu.źródło
break
(zamiastexit
) 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.