Abschnitte der Website
Wahl des Herausgebers:
- So rufen Sie einen „lebenden“ Beeline-Betreiber direkt an: gebührenfreie Telefonnummern
- Wichtige PDF-Reader
- Lineage II – Zwischenspiel: The Chaotic Throne startet nicht?
- Excel-Passwortwiederherstellung
- So fügen Sie ein neues Zifferblatt zu Android Wear-Smartwatches hinzu
- Der profitabelste Tarifplan Life
- So übertragen Sie Daten von Samsung zu Xiaomi Miui Google-Kontakten
- CSS-Bildfilter Funktionen und Syntax von CSS-Filtern
- Alle Farben der Galaxy S8-Hülle und welche ist besser zu kaufen?
- Mikrotik hAP AC – Ein Router für alle Fälle Bevor Sie mit dem Testen beginnen
Werbung
Bash while-Endlosschleife. Endlose While-Schleife im BASH-Skript |
Autor: Paul Cobbaut Veröffentlichungsdatum: 16. Oktober 2014 Übersetzung: A. Panin Übersetzungsdatum: 21. Dezember 2014 Kapitel 22. Schleifen in SkriptenTestbefehlMit dem Testbefehl können Sie feststellen, ob ein Ausdruck wahr oder falsch ist. Beginnen wir damit, zu testen, ob der ganzzahlige Wert 10 größer als der ganzzahlige Wert 55 ist. $ test 10 -gt 55 ; Echo $? 1$ Der Testbefehl gibt 1 zurück, wenn der Ausdruck falsch ist. Und wie Sie im folgenden Beispiel sehen werden, gibt der Testbefehl 0 zurück, wenn der Ausdruck „true“ ergibt. $ test 56 -gt 55 ; Echo $? 0 $ Wenn Sie lieber mit den Zeichenfolgen „true“ und „false“ arbeiten, können Sie den Testbefehl wie unten gezeigt verwenden. $ test 56 -gt 55 && echo true || echo false true $ test 6 -gt 55 && echo true || echo false false Der Testbefehl kann auch durch eckige Klammern ersetzt werden, sodass die Befehle im Beispiel unten genau die gleichen sind wie die Befehle im Beispiel oben. Durchführung diverser Kontrollen.< $bar ] Будет ли строка abc расположена выше значения переменной $bar в списке после сортировки? [ -f foo ] Является ли foo обычным файлом? [ -r bar ] Является ли bar читаемым файлом? [ foo -nt bar ] Новее ли файл foo файла bar ? [ -o nounset ] Активирован ли параметр командной оболочки nounset ? [ -d foo ] Existiert das Verzeichnis foo? [ -e bar ] Existiert die bar-Datei? [ "/etc" = $PWD ] Entspricht /etc dem Wert von $PWD? [ $1 != "secret" ] Unterscheidet sich der Wert des ersten Skriptparameters von der geheimen Zeichenfolge? [ 55 -lt $bar ] Ist der ganzzahlige Wert 55 kleiner als der Wert von $bar? [ $foo -ge 1000 ] Ist der Wert von $foo größer oder gleich dem ganzzahligen Wert 1000? ["ABC" Testoperatoren können mit Operatoren kombiniert werden, die den logischen Operatoren „AND“ und „OR“ entsprechen.paul@RHEL4b:~$ [ 66 -gt 55 -a 66 -lt 500 ] && echo true || echo false true paul@RHEL4b:~$ [ 66 -gt 55 -a 660 -lt 500 ] && echo true || echo false false paul@RHEL4b:~$ [ 66 -gt 55 -o 660 -lt 500 ] && echo true || Echo falsch wahr Bedingter Sprung wenn dann sonst Das if then else-Konstrukt soll eine Codeoption auswählen. Wenn eine bestimmte Bedingung erfüllt ist, wird ein Teil des Codes ausgeführt, andernfalls wird ein anderer Code ausgeführt. Das folgende Beispiel prüft, ob eine Datei vorhanden ist. Wenn die Annahme der Existenz der Datei bestätigt wird, wird anschließend eine entsprechende Meldung angezeigt.#!/bin/bash if [ -f isit.txt ] then echo die Datei isit.txt existiert! sonst Echo-Datei isit.txt nicht gefunden! fi Für den Fall, dass wir sparendiesen Code Wenn Sie das Skript in einer Datei mit dem Namen „choice“ ablegen, kann es auf die gleiche Weise ausgeführt werden.$ ./choice Datei isit.txt nicht gefunden! $ touch isit.txt $ ./choice Datei isit.txt existiert! $ Bedingter Sprung wenn dann elifSie können einen neuen Operator posten bedingter Sprung Ein dem oben vorgestellten völlig ähnliches Skript kann ohne Verwendung einer eingebetteten Befehls-Shell erstellt werden, indem die Bash-Shell-Deklaration für einen Wertebereich (von Wert bis Wert) verwendet wird. #!/bin/bash für Zähler in (1..20) führt Echozählung von 1 bis 20 durch, aktueller Wert $counter Sleep 1 fertig IN diesen Zyklus for verwendet einen Mechanismus zum Durchsuchen von Dateien nach Mustern (implementiert als Teil des Befehlserweiterungsmechanismus). Wenn die oben genannten Anweisungen direkt in veröffentlicht werden Befehlszeile , es wird ähnlich funktionieren.kahlan@solexp11$ ls count.ksh go.ksh kahlan@solexp11$ für Datei in *.ksh ; mach cp $file $file.backup ; erledigt kahlan@solexp11$ ls count.ksh count.ksh.backup go.ksh go.ksh.backup while-Schleife Unten finden Sie ein einfaches Beispiel für die Verwendung einer While-Schleife.ich=100; while [ $i -ge 0 ] ; do echo Countdown von 100 auf 0, aktueller Wert $i; lass ich--; ErledigtEndlosschleifen können mithilfe von while true- oder while:-Deklarationen implementiert werden, wobei das Symbol: das Äquivalent der fehlenden Operation in der Korn-Shell und Bash ist. #!/bin/ksh # Endlosschleife while: do echo hello sleep 1 done Bis-Schleife Unten finden Sie ein einfaches Beispiel für die Verwendung einer Until-Schleife. sei i=100; bis [ $i -le 0 ] ; do echo Countdown von 100 auf 1, aktueller Wert $i; lass ich--; Erledigt Übung: Tests und Schleifen in Skripten3. Entwickeln Sie ein Skript, das verwendet wird while-Schleife von 3 bis 7 zählen. 4. Entwickeln Sie ein Skript, das eine Bis-Schleife verwendet, um von 8 auf 4 herunterzuzählen.5. Entwickeln Sie ein Skript, das Dateien mit der Erweiterung .txt im aktuellen Verzeichnis zählt. Iterieren über einfache WerteDas vielleicht einfachste Beispiel einer for-Schleife in Bash-Skripten ist das Durchlaufen einer Liste einfacher Werte:#!/bin/bash für var im ersten zweiten dritten vierten fünften do echo Das $var-Element ist fertig
Bitte beachten Sie, dass die Variable $var beim Verlassen der Schleife ihren Wert behält, ihr Inhalt geändert werden kann und Sie im Allgemeinen wie jede andere Variable mit ihr arbeiten können. Iterieren über komplexe WerteDie zum Initialisieren der for-Schleife verwendete Liste kann nicht nur einfache Zeichenfolgen enthalten, die aus einem Wort bestehen, sondern auch ganze Phrasen, die mehrere Wörter und Satzzeichen enthalten. Es könnte zum Beispiel so aussehen:#!/bin/bash für var in erster „der zweiten“ „der dritten“ „Ich mache es“ do echo „Das ist: $var“ fertig
Initialisieren einer Schleife mit einer Liste, die aus den Ergebnissen des Befehls erhalten wirdEine andere Möglichkeit, eine for-Schleife zu initialisieren, besteht darin, ihr eine Liste zu übergeben, die das Ergebnis eines Befehls ist. Hier wird die Befehlsersetzung verwendet, um sie auszuführen und die Ergebnisse ihrer Arbeit zu erhalten.#!/bin/bash file="myfile" für var in $(cat $file) do echo " $var" done
Hierbei muss berücksichtigt werden, dass ein solcher Ansatz, wenn eine zeilenweise Datenverarbeitung erwartet wird, für eine Datei, die größer als ist, nicht funktioniert komplexe Struktur, dessen Zeilen mehrere durch Leerzeichen getrennte Wörter enthalten können. Die Schleife verarbeitet einzelne Wörter, keine Zeilen. Was ist, wenn dies überhaupt nicht das ist, was Sie brauchen? FeldtrennzeichenDer Grund für die oben genannte Funktion ist das Besondere Umgebungsvariable, das IFS (Internal Field Separator) heißt und es Ihnen ermöglicht, Feldtrennzeichen anzugeben. Standardmäßig betrachtet die Bash-Shell die folgenden Zeichen als Feldtrennzeichen:
Um das Problem zu lösen, können Sie vorübergehend ändern Umgebungsvariable IFS. So machen Sie es in einem Bash-Skript, vorausgesetzt, Sie benötigen nur eine neue Zeile als Feldtrennzeichen: IFS=$"\n" #!/bin/bash file="/etc/passwd" IFS=$"\n" für var in $(cat $file) echo " $var" done
Trennzeichen können auch andere Zeichen sein. Oben haben wir beispielsweise den Inhalt der Datei /etc/passwd angezeigt. Benutzerdaten in Zeilen werden durch Doppelpunkte getrennt. Wenn Sie solche Zeichenfolgen in einer Schleife verarbeiten müssen, kann IFS wie folgt konfiguriert werden: Durchsuchen von Dateien, die in einem Verzeichnis enthalten sindEine der häufigsten Anwendungen von for-Schleifen in Bash-Skripten besteht darin, Dateien in einem Verzeichnis zu durchlaufen und diese Dateien zu verarbeiten.So listen Sie beispielsweise Dateien und Ordner auf: #!/bin/bash für Datei in /home/likegeeks/* do if [ -d "$file" ] then echo "$file is adirectory" elif [ -f "$file" ] then echo "$file is a Datei" fi fertig Dies ist die Ausgabe des Skripts.
Beachten Sie, wie wir die Schleife initialisieren, nämlich den Platzhalter „*“ am Ende der Ordneradresse. Dieses Symbol kann man sich als Platzhalter vorstellen und bedeutet: „alle Dateien mit beliebigen Namen“. Es ermöglicht Ihnen, sich zu organisieren automatische Substitution Dateinamen, die dem Muster entsprechen. Beim Testen einer Bedingung in einer if-Anweisung setzen wir den Variablennamen in Anführungszeichen. Dies geschieht, weil der Datei- oder Ordnername Leerzeichen enthalten kann. C-Stil für SchleifenWenn Sie mit der Programmiersprache C vertraut sind, kommt Ihnen die Syntax zur Beschreibung von Bash-For-Schleifen möglicherweise seltsam vor, da Sie es offensichtlich gewohnt sind, Schleifen auf diese Weise zu beschreiben:Für (i = 0; i< 10; i++)
{
printf("number is %d\n", i);
}
For ((Anfangswert der Variable; Bedingung für Schleifenende; Änderung der Variable)) Für ((a = 1; a< 10; a++))
#!/bin/bash für ((i=1; i<= 10; i++))
do
echo "number is $i"
done
Looping im C-Stil while-SchleifeDas for-Konstrukt ist nicht die einzige Möglichkeit, Schleifen in Bash-Skripten zu organisieren. Sie können hier auch while-Schleifen verwenden. In einer solchen Schleife können Sie einen Befehl zum Überprüfen einer bestimmten Bedingung angeben und den Schleifenkörper ausführen, bis die getestete Bedingung Null oder ein Signal für den erfolgreichen Abschluss einer bestimmten Operation zurückgibt. Wenn die Schleifenbedingung einen Wert ungleich Null zurückgibt, was einen Fehler bedeutet, wird die Schleife gestoppt.Hier ist ein Diagramm der Organisation von While-Schleifen Schauen wir uns ein Beispielskript mit einer Schleife wie dieser an: #!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done Ergebnis der while-Schleife Wenn Sie die Variable $var1 nicht ändern, endet das Skript in einer Endlosschleife. Verschachtelte SchleifenSie können beliebige Befehle im Schleifenkörper verwenden, einschließlich des Startens anderer Schleifen. Solche Konstruktionen nennt man verschachtelte Schleifen:#!/bin/bash für ((a = 1; a<= 3; a++))
do
echo "Start $a:"
for ((b = 1; b <= 3; b++))
do
echo " Inner loop: $b"
done
done
Verschachtelte Schleifen Dateiinhalte verarbeitenAm häufigsten werden verschachtelte Schleifen zum Verarbeiten von Dateien verwendet. Die äußere Schleife durchläuft also die Zeilen der Datei und die innere Schleife arbeitet bereits mit jeder Zeile. So sieht beispielsweise die Verarbeitung der Datei /etc/passwd aus:#!/bin/bash IFS=$"\n" für Eintrag in $(cat /etc/passwd) do echo "Values in $entry –" IFS=: for value in $entry do echo " $value" done Erledigt Dateidatenverarbeitung Dieser Ansatz kann bei der Verarbeitung von CSV-Dateien oder ähnlichen Dateien verwendet werden, indem das Trennzeichen nach Bedarf in die IFS-Umgebungsvariable geschrieben wird. ZyklusmanagementMöglicherweise müssen Sie nach dem Eintritt in die Schleife diese stoppen, wenn die Schleifenvariable einen bestimmten Wert erreicht, der nicht der ursprünglich festgelegten Bedingung zum Beenden der Schleife entspricht. Muss in einer solchen Situation auf den normalen Abschluss des Zyklus gewartet werden? Natürlich nicht, und in solchen Fällen sind die folgenden beiden Befehle hilfreich:
break-BefehlMit diesem Befehl können Sie die Ausführung einer Schleife unterbrechen. Es kann sowohl für for- als auch für while-Schleifen verwendet werden:#!/bin/bash für var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Number: $var1" done Eine for-Schleife vorzeitig verlassen Hier ist das Gleiche, aber für die while-Schleife: #!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo "Iteration: $var1" var1=$(($var1 + 1)) done Befehl fortsetzenWenn dieser Befehl im Hauptteil der Schleife angetroffen wird, endet die aktuelle Iteration vorzeitig und die nächste beginnt, ohne die Schleife zu verlassen. Schauen wir uns den continue-Befehl in einer for-Schleife an:#!/bin/bash für ((var1 = 1; var1< 15; var1++))
do
if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
then
continue
fi
echo "Iteration number: $var1"
done
Der continue-Befehl in einer for-Schleife Die Ausgabe wird in einer Schleife verarbeitetDie Datenausgabe einer Schleife kann verarbeitet werden, indem die Ausgabe entweder umgeleitet oder an eine Pipeline übergeben wird. Dies geschieht durch das Hinzufügen von Ausgabeverarbeitungsbefehlen nach der done-Anweisung.Anstatt beispielsweise auf dem Bildschirm anzuzeigen, was in einer Schleife ausgegeben wird, können Sie alles in eine Datei schreiben oder an eine andere Stelle übergeben: #!/bin/bash für ((a = 1; a< 10; a++))
do
echo "Number is $a"
done >myfile.txt echo „fertig.“ Schleifenausgabe in eine Datei umleiten Beispiel: Suche nach ausführbaren DateienLassen Sie uns das verwenden, was wir bereits behandelt haben, und etwas Nützliches schreiben. Wenn Sie beispielsweise herausfinden möchten, welche ausführbaren Dateien auf dem System verfügbar sind, können Sie alle in der Umgebungsvariablen PATH aufgezeichneten Ordner scannen. Wir verfügen bereits über das gesamte Arsenal an Werkzeugen, die wir dafür benötigen, wir müssen es nur noch zusammenfügen:#!/bin/bash IFS=: für Ordner in $PATH echo „$folder:“ für Datei in $folder/* do if [ -x $file ] then echo „ $file“ fi done done Suche nach ausführbaren Dateien in Ordnern anhand der PATH-Variablen ErgebnisseHeute haben wir über for- und while-Schleifen in Bash-Skripten gesprochen, wie man sie ausführt und wie man sie verwaltet. Jetzt wissen Sie, wie Sie Zeichenfolgen mit unterschiedlichen Trennzeichen in Schleifen verarbeiten, wie Sie die Datenausgabe in Schleifen in Dateien umleiten und wie Sie den Inhalt von Verzeichnissen anzeigen und analysieren.Wenn wir davon ausgehen, dass Sie ein Entwickler von Bash-Skripten sind, der nur das kennt, was im ersten Teil dieser Artikelserie und im zweiten Teil gesagt wird, dann können Sie bereits etwas Nützliches schreiben. Vor uns liegt der dritte Teil. Nachdem Sie ihn verstanden haben, erfahren Sie, wie Sie Parameter und Befehlszeilenschalter an Bash-Skripte übergeben und was Sie damit machen. Eine kurze Beschreibung der Unterschiede zwischen den Schleifentypen: for – führt eine Aktion aus, solange es auszuführende Objekte gibt (z. B. das Lesen eines Streams aus stdin, einer Datei oder einer Funktion); FOR-SchleifeBetrachten wir diese Version des Skripts mit einer Schleife: $ cat loop.sh #!/bin/bash für Variable in „ls -1“ echo „$variable“ ausführen fertig Die Syntax ist sehr einfach und wird im Beispiel ganz anschaulich dargestellt: for (Schleife starten) Variable (eine Variable deklarieren, für die wir Aktionen ausführen) in (einen Fluss an die Schleife senden) `ls -1` (Befehl, der ausgeführt und an die Variable $variable übergeben werden soll). Do und done sind der „Körper“ der Schleife, in dem die Hauptaktionen an den empfangenen Daten ausgeführt werden, und echo „$variable“ ist die tatsächliche Aktion, die von der Schleife ausgeführt wird. Lassen Sie uns nun das Beispiel ein wenig ändern und statt den Befehl explizit anzugeben, verwenden wir die zweite Variable: $ cat loop.sh #!/bin/bash ls=`ls -1` für Variable in $ls do echo „$variable“ done Jetzt wird der Befehl ls -1 in einer separaten Variablen übergeben, wodurch Sie flexibler mit der Schleife arbeiten können. Anstelle einer Variablen in einer Schleife können Sie auch eine Funktion verwenden: $ cat loop.sh #!/bin/bash lsl () ( ls -1 ) für Variable in „lsl“ echo „$variable“ ausführen fertig Die Hauptbedingung der for-Schleife besteht darin, dass sie ausgeführt wird, solange der an sie übergebene Befehl Objekte für die Aktion enthält. Basierend auf dem obigen Beispiel – solange ls -1 Dateien zum Anzeigen hat – übergibt die Schleife diese an eine Variable und führt den „Schleifenkörper“ aus. Sobald die Liste der Dateien im Verzeichnis endet, wird die Schleife ausgeführt. Machen wir das Beispiel etwas komplizierter. Das Verzeichnis enthält eine Liste von Dateien: $ ls -1 file1 file2 file3 file4 file5 loop.sh nofile1 nofile2 nofile3 nofile4 nofile5 Wir müssen nur diejenigen auswählen, die das Wort „“ nicht enthalten. NEIN«: $ cat loop.sh #!/bin/bash lsl=`ls -1` für Variable in $lsl do echo „$variable“ | grep -v "no" done $ ./loop.sh file1 file2 file3 file4 file5 loop.sh Sie können bedingte Ausdrücke auch in einer Schleife verwenden ( Bedingte Ausdrücke) […] um Bedingungen zu prüfen und die break-Anweisung, um die Schleife zu unterbrechen, wenn die Bedingung ausgelöst wird. Betrachten Sie dieses Beispiel: $ cat loop.sh #!/bin/bash lsl=`ls -1` für Variable in $lsl do if [ $variable != "loop.sh" ] then echo "$variable" | grep -v "no" sonst break fi fertig Die Schleife wird ausgeführt, bis die Datei loop.sh gefunden wird. Sobald die Ausführung der Schleife diese Datei erreicht, wird die Schleife durch den Befehl break unterbrochen: $ ./loop.sh Datei1 Datei2 Datei3 Datei4 Datei5 Ein weiteres Beispiel ist die Verwendung arithmetischer Operationen unmittelbar vor der Ausführung des Schleifenkörpers: $ cat loop.sh #!/bin/bash for ((count=1; count<11; count++)) do echo "$count" done Hier legen wir drei Steuerbefehle fest – count=1, eine Steuerbedingung – während count kleiner als 11 ist, und einen auszuführenden Befehl – count +1: WHILE- und UNTIL-SchleifenEin einfaches Beispiel, das deutlich zeigt, wie die while-Schleife funktioniert: $ cat loop.sh #!/bin/bash count=0 while [ $count -lt 10 ] do ((count++)) echo $count done Wir setzen die Variable $count auf Null und führen dann die while-Schleife mit der Bedingung aus: „Solange $count kleiner als zehn ist, führen Sie die Schleife aus.“ Im Hauptteil der Schleife führen wir aus Postfix-Inkrement+1 für die Variable $count und das Ergebnis wird auf stdout ausgegeben. Ausführungsergebnis: $ ./loop.sh 1 2 3 4 5 6 7 8 9 10 Sobald der Wert der Variablen $count 10 wurde, wurde die Schleife gestoppt. Ein gutes Beispiel für eine „Endlosschleife“, das zeigt, wie while funktioniert: $ cat loop.sh #!/bin/bash count=10 while [ 1 = 1 ] do ((count++)) echo $count done $ ./loop.sh ... 5378 5379 5380 5381 5382 5383 ^C Die Until-Schleife funktioniert ähnlich, jedoch in umgekehrter Richtung: $ cat loop.sh #!/bin/bash count=0 bis [ $count -gt 10 ] do ((count++)) echo $count done Hier legen wir eine ähnliche Bedingung fest, aber statt „solange die Variable kleiner als 10 ist“ geben wir an „bis die Variable größer als 10 wird“. Ausführungsergebnis: $ ./loop.sh 1 2 3 4 5 6 7 8 9 10 11 Wenn das obige Beispiel einer „Endlosschleife“ mit „bis“ ausgeführt wird, wird im Gegensatz zu „while“ nichts ausgegeben: $ cat loop.sh #!/bin/bash count=10 Until [ 1 = 1 ] do ((count++)) echo $count done $ ./loop.sh $ Weil " Zustand"ursprünglich" WAHR„—Der Schleifenkörper wird nicht ausgeführt. Genau wie in der for-Schleife können Sie Funktionen in while und Until verwenden. Zum Beispiel eine Schleife aus einem realen Skript, das den Serverstatus überprüft Kater(PID wird vom System übernommen SLES, kann in anderen Systemen abweichen), eine leicht vereinfachte Version: $ cat loop.sh #!/bin/bash check_tomcat_status () ( RUN=`ps aux | grep tomcat | grep -v grep | grep java | awk "(print $2)"` ) while check_tomcat_status do if [ -n "$ RUN“ ] dann printf „WARNUNG: Tomcat läuft immer noch mit PID $RUN.“ Ausführungsergebnis: else printf „Tomcat hat angehalten, geht weiter...nn“ break fi done $ ./loop.sh WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch läuft mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 26548.WARNUNG: Tomcat läuft immer noch mit PID 14435 Vollversion: Check_tomcat_status () ( RUN=`ps aux | grep tomcat | grep -v grep | grep java | awk "(print $2)"` ) while check_tomcat_status; do if [ -n "$RUN" ] then printf "WARNUNG: Tomcat läuft immer noch mit PID $RUN. Stoppen? " Antwort "Stoppt Tomcat..." "Installation wird fortgesetzt..." && $CATALINA_HOME/bin/shutdown . sh 2&>1 /dev/null || break sleep 2 if [ -n "$RUN" ] then printf „Tomcat läuft noch. Kill it?“ Antwort „Tomcat wird getötet…“ „Installation wird fortgesetzt...n“ && kill $RUN || break sleep 2 fi else printf „Tomcat gestoppt, fährt fort...nn“ break fi fertig Answer () ( beim Lesen der Antwort; echo case $response in |) printf "$1n" return 0 break ;; |) printf „$2n“ return 1 break ;; *) printf „Bitte geben Sie Y(ja) oder N(nein) ein!“ esac done ) Hier war es möglich, sowohl while als auch Until zu verwenden – jedoch keine for-Schleife, da for einmal funktioniert hätte (die PID erhalten und beendet). Schleifen sind beim Schreiben von Programmen oder Skripten äußerst praktisch, ja sogar notwendig. Sie ermöglichen es uns, einen bestimmten Codeabschnitt eine bestimmte Anzahl von Malen auszuführen. Natürlich gibt es in der Bash mehrere Arten von Schleifen. Wir werden die Zyklen beschreiben für in, für, während, bis:. Obwohl for in und for als unterschiedliche Syntaxen derselben Anweisung betrachtet werden, unterscheiden sie sich meiner Meinung nach stärker voneinander als while from Until. Schleife mit Zähler für In Zyklus Beim Erstellen einer Liste von Argumenten können Sie die Befehlsersetzung in einer for-Schleife verwenden. Tun für Namen in Name1 Name2 Name3 Name4 echo $names Schleifenoperator<приращение счётчиков>Der Wert unserer Variablenzähler muss sich unbedingt ändern (nicht unbedingt nach oben), damit wir bei der Überprüfung der Bedingung früher oder später den Wert false erhalten, sonst endet die Schleife nie. Eine sehr praktische und vor allem vertraute Option, wenn ein Vorgang eine bestimmte Anzahl von Malen wiederholt werden muss. Mit einer ähnlichen Syntax: Tun while-Schleife:Dies ist eine ziemlich einfache Konstruktion, die den Zustand hinter dem Bediener überprüft während und wenn diese Bedingung wahr ist, führt es den Befehlsblock zwischen den Wörtern do und done aus und fährt dann erneut mit der Überprüfung der Bedingung fort. Wenn die Prüfung „Falsch“ zurückgibt, endet der Zyklus und die folgenden Befehle werden ausgeführt: Erledigt. Dafür muss unbedingt gesorgt werden<проверка условия>hing davon ab, welcher Code in der Schleife ausgeführt wird. Andernfalls erhalten Sie eine Endlosschleife, wenn sich das Ergebnis der Prüfung nicht ändert. Beim Erstellen einer Liste von Argumenten können Sie die Befehlsersetzung in einer for-Schleife verwenden. Tun Operator während kann mehrere Bedingungen haben. Aber nur der letzte von ihnen bestimmt die Möglichkeit, den Zyklus fortzusetzen. In diesem Fall unterscheidet sich die Syntax des Schleifenoperators von der üblichen. <условиеN> Bis-Schleife:Operator bis ist while sehr ähnlich. Es wertet ebenfalls die Bedingung aus, führt jedoch den Schleifenkörper aus, wenn das Ergebnis der Berechnung falsch ist. Es mag ungewöhnlich erscheinen, aber Until wertet die Bedingung vor dem ersten Durchlauf der Schleife aus, z. B. while, und nicht danach. Wie bei for/in-Schleifen müssen Sie ein „;“-Zeichen einfügen, wenn Sie das Schlüsselwort „do“ in derselben Zeile wie die Schleifendeklaration platzieren. vorher tun. Beim Erstellen einer Liste von Argumenten können Sie die Befehlsersetzung in einer for-Schleife verwenden. Tun Das reicht wahrscheinlich für den Moment. :) :)
Neue Artikel:
0 Meeran Bala-Kumaran Ich versuche wirklich zu verstehen, warum diese While-Schleife nie endet. Wenn die Schleife beginnt, ist meine LOC-Variable auf Testing/ gesetzt. Das Verzeichnis, das ich zum Testen dieses Programms erstellt habe, hat das folgende Layout: Ich möchte, dass die Schleife endet, sobald auf alle Verzeichnisse die Funktion „Zählen“ angewendet wurde. Ich habe die Zählfunktion überprüft und sie erzeugt keine Endlosschleife Ich habe versucht, den Algorithmus manuell auszuführen PARSE=1 LOC=$LOC/ count AVAILABLEDIR=$(ls $LOC -AFl | sed "1 d" | grep "/$" | awk "( print $9 )") while [ $PARSE = "1" ] do if [[ $(AVAILABLEDIR[@]) == "" ]]; then PARSE=0 fi DIRBASE=$LOC für a in $(AVAILABLEDIR[@]); do LOC="$(DIRBASE)$(a)" LOCLIST="$LOCLIST $LOC" count done for a in $(LOCLIST[@]); do TMPAVAILABLEDIR=$(ls $a -AFl | sed "1 d" | grep "/$" | awk "( print $9 )") PREPEND=$a if [[ $(TMPAVAILABLEDIR[@]) == "" ] ]; dann weiter fi für a in $(TMPAVAILABLEDIR[@]); do TMPAVAILABLEDIR2="$TMPAVAILABLEDIR2 $(PREPEND[@])$(a)" done NEWAVAILABLEDIR="$NEWAVAILABLEDIR $TMPAVAILABLEDIR2" done AVAILABLEDIR=$NEWAVAILABLEDIR NEWAVAILABLEDIR="" LOC="" done Ich habe wirklich Probleme und wäre für jede Eingabe sehr dankbar. Ich habe in den letzten zwei Stunden versucht, das herauszufinden. Bash-Endlosschleife 4 AntwortenSie sollten versuchen, das Skript mit dem Argument -x auszuführen oder es in die erste Zeile zu schreiben: #!/bin/bash -x Dann erzählt er dir alles, was er tut. In diesem Fall bemerken Sie möglicherweise zwei Fehler: Sie laden TMPAVAILABLEDIR2 niemals neu Sie führen ls auch für reguläre Dateien aus. Wenn Sie eine Rekursion wirklich vermeiden müssen, versuchen Sie Folgendes, ganz ohne Rekursion: #!/bin/bash count() ( echo counting „$1“ ) todo=(Testing) while test $(#todo[@]) != 0 do doit=("$(todo[@])") todo= () für Verzeichnis in „$(doit[@])“ für Eintrag in „$dir“/* # Wenn Verzeichnis leer ist, wird ein Eintrag mit dem Namen „*“ angezeigt. do test -e „$entry“ || continue # den Eintrag „*“ eines leeren Verzeichnisses überspringen count „$entry“ test -d „$entry“ || weiter todo+=("$entry") erledigt erledigt erledigt Sagen Sie mir jedoch bitte, warum Sie keine Rekursion verwenden können. Ist das eine Art Allergie? Gelübde? Gibt es an Ihrem Wohnort lokale Gesetze gegen rekursive Software? Sie haben geschrieben, dass Sie alle Schnitte „zählen“ möchten. Schauen Sie sich die Suchoptionen an: Finden Sie $LOC -type d | while read dir; do cd $LOC cd $(dir) count done oder kürzer (wenn Ihr Funktionszähler das Verzeichnis als Parameter 1 verwendet) Finden Sie $LOC -type d | xargs zählen Jetzt sehe ich, dass Sie weder find noch ls -R (rekursive Funktion) verwenden möchten. Dann sollten Sie Ihre eigene rekursive Funktion erstellen Funktion parseDir ( ls -d */ $1 | while read dir; do count parseDir $1/$dir done ) Ich habe keine Ahnung, ob das funktionieren wird, aber es ist eine interessante Frage, über die ich ständig nachdenken musste. Viel Glück Während wahr; tun für Wort in "$(echo *)" ; tun, wenn [[ -d "$word" ]] ; then d[$((i++))]="$PWD"/"$word" elif [[ -f "$word" ]] ;then f[$((j++))]="$PWD"/"$ Wort" fi done [[ $k -gt $i ]] && cd .. cd "$d[$((k++))]" || Pause geschafft |
Beliebt:
Neu
- Wichtige PDF-Reader
- Lineage II – Zwischenspiel: The Chaotic Throne startet nicht?
- Excel-Passwortwiederherstellung
- So fügen Sie ein neues Zifferblatt zu Android Wear-Smartwatches hinzu
- Der profitabelste Tarifplan Life
- So übertragen Sie Daten von Samsung zu Xiaomi Miui Google-Kontakten
- CSS-Bildfilter Funktionen und Syntax von CSS-Filtern
- Alle Farben der Galaxy S8-Hülle und welche ist besser zu kaufen?
- Mikrotik hAP AC – Ein Router für alle Fälle Bevor Sie mit dem Testen beginnen
- So berechnen Sie den Bassreflex für ein Akustiksystem am besten