bash .sh Skriptschleifen statt Beenden / Beenden

377
Ev-

Ich schreibe mein erstes Bash-Skript. Jedes Mal, wenn ich es ausgeführt habe, um sicherzustellen, dass es funktioniert, funktioniert alles genau so, wie ich es gerne hätte, mit Ausnahme des doneBefehls ganz am Ende. Stattdessen springt er zu der Frage, in der der Benutzer gefragt wird, ob er sicher ist, dass er sie zur Durchführung der vorgenommenen Änderungen autorisieren möchte.

Da dies das erste Mal ist, dass ich ein Skript schreibe, bin ich sicher, dass es bessere und effizientere Methoden gibt, um die Aktion auszuführen, für die ich es geschrieben habe. Ich frage daher nicht nach Eingaben. Die Tatsache, dass es das tut, was ich möchte (obwohl es nicht enden kann), ist für mich an dieser Stelle gut genug.

Hier ist das Skript (alles, was Sie sehen, [with backets]ist etwas, das ich nur für diese SU: Frage und nicht wirklich im Skript selbst enthalten habe):

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

Vielen Dank, dass Sie sich diese Frage angesehen haben und mir geholfen haben!

~ Ev

0
Nun, was haben Sie erwartet? während wahr; do` bedeutet "dies für immer tun"; Es ist nicht möglich, die Schleife zu beenden, außer durch den "exit", wenn der Benutzer "no" eingibt. Scott vor 6 Jahren 2

1 Antwort auf die Frage

1
simlev

mit Ausnahme des doneBefehls

done ist kein Befehl.

Es scheint ein Missverständnis zu bestehen: Das Schlüsselwort donebedeutet nicht, dass das Skript fertig ist und die Ausführung beenden kann. Es ist stattdessen das Gegenstück zum vorherigen doSchlüsselwort in der while...do. Dies bedeutet: Wenn die whileBedingung falsch ist, führen Sie die nächste Anweisung nach dem doneSchlüsselwort aus.

Vielleicht möchten Sie exitam Ende der Liste ein Kommando hinzufügen, das ausgeführt wird, wenn der Benutzer dies wählt Y.

Aktualisieren:

Ich erwähnte exiteinfach, weil es bereits in der [Nn]Branche verwendet wurde, aber das Skript hätte das Problem nur behoben . Die Verwendung breakanstelle der exitvon Gordon Davisson vorgeschlagenen Methode ist stattdessen eine bessere Idee, die eine Verbesserung darstellt und die Weiterentwicklung des Skripts ermöglicht.

Die Verwendung von "break" (anstelle von "exit") würde ebenfalls funktionieren - das würde dazu führen, dass es nach dem Ende der Schleife fortgesetzt wird (das "done" - Schlüsselwort). Wenn also mehr im Skript vorhanden wäre, würde es ausgeführt werden . Gordon Davisson vor 6 Jahren 1