Website-Suche

Lernen Sie den Python-Kontrollfluss und Schleifen zum Schreiben von Linux-Skripten kennen


Im vorherigen Artikel dieser Python-Serie haben wir eine kurze Einführung in Python, seine Befehlszeilen-Shell und den IDLE gegeben.

Wir haben auch gezeigt, wie arithmetische Berechnungen durchgeführt werden, wie Werte in Variablen gespeichert werden und wie diese Werte wieder auf dem Bildschirm ausgegeben werden. Abschließend erläuterten wir die Konzepte von Methoden und Eigenschaften im Kontext der objektorientierten Programmierung anhand eines praktischen Beispiels.

In diesem Leitfaden werden wir den Kontrollfluss (um je nach den von einem Benutzer eingegebenen Informationen, dem Ergebnis einer Berechnung oder dem aktuellen Wert einer Variablen verschiedene Handlungsoptionen zu wählen) und Schleifen (um sich wiederholende Aufgaben zu automatisieren) besprechen und dann das bisher Gelernte anwenden, um ein einfaches Shell-Skript zu schreiben, das den Betriebssystemtyp anzeigt. Der Hostname, die Kernel-Version, die Version und der Hardwarename des Computers.

Dieses Beispiel ist zwar einfach, hilft uns aber zu veranschaulichen, wie wir die Fähigkeiten von Python OOP nutzen können, um Shell-Skripte einfacher zu schreiben als mit normalen Bash-Tools.

Mit anderen Worten, wir wollen von

# uname -snrvm

An

oder

Sieht hübsch aus, nicht wahr? Krempeln wir die Ärmel hoch und machen wir es möglich.

Lernen Sie die Ablaufsteuerung in Python kennen

Wie wir bereits erwähnt haben, ermöglicht uns die Ablaufsteuerung, je nach einer bestimmten Bedingung unterschiedliche Ergebnisse auszuwählen. Die einfachste Implementierung in Python ist eine if/else-Klausel.

Die grundlegende Syntax lautet:

if condition:
    # action 1
else:
    # action 2
  • Wenn die Bedingung als wahr ausgewertet wird, wird der folgende Codeblock ausgeführt (dargestellt durch # Aktion 1). Andernfalls wird der Code unter else ausgeführt.
  • Eine Bedingung kann eine beliebige Anweisung sein, die entweder als wahr oder falsch ausgewertet werden kann.

Zum Beispiel:

1 < 3 # true
firstName == "Gabriel" # true for me, false for anyone not named Gabriel
  • Im ersten Beispiel haben wir zwei Werte verglichen, um zu bestimmen, ob einer größer als der andere ist.
  • Im zweiten Beispiel haben wir firstName (eine Variable) verglichen, um zu bestimmen, ob ihr Wert am aktuellen Ausführungspunkt mit "Gabriel" identisch ist
  • Auf die Bedingung und die else-Anweisung muss ein Doppelpunkt (:)
  • Die Einrückung ist in Python wichtig. Zeilen mit identischem Einzug werden als im selben Codeblock befindlich betrachtet.

Bitte beachten Sie, dass die if/else-Anweisung nur eines der vielen Kontrollflusswerkzeuge ist, die in Python verfügbar sind. Wir haben es hier überprüft, da wir es später in unserem Skript verwenden werden. Weitere Informationen zu den restlichen Tools finden Sie in der offiziellen Dokumentation.

Lernschleifen in Python

Einfach ausgedrückt ist eine Schleife eine Abfolge von Anweisungen oder Anweisungen, die der Reihe nach ausgeführt werden, solange eine Bedingung wahr ist, oder einmal pro Element in einer Liste.

Die einfachste Schleife in Python wird durch die for-Schleife dargestellt, die über die Elemente einer bestimmten Liste oder einer Zeichenkette iteriert, die mit dem ersten Element beginnt und mit dem letzten endet.

Grundlegende Syntax:

for x in example:
	# do this

Hier kann das Beispiel entweder eine Liste oder eine Zeichenfolge sein. Wenn Ersteres der Fall ist, stellt die Variable mit dem Namen x jedes Element in der Liste dar. Wenn letzteres der Fall ist, steht x für jedes Zeichen in der Zeichenfolge:

>>> rockBands = []
>>> rockBands.append("Roxette")
>>> rockBands.append("Guns N' Roses")
>>> rockBands.append("U2")
>>> for x in rockBands:
    	print(x)
or
>>> firstName = "Gabriel"
>>> for x in firstName:
    	print(x)

Die Ausgabe der obigen Beispiele ist in der folgenden Abbildung dargestellt:

Python-Module

Aus offensichtlichen Gründen muss es eine Möglichkeit geben, eine Sequenz von Python-Anweisungen und -Anweisungen in einer Datei zu speichern, die bei Bedarf aufgerufen werden kann.

Genau das ist ein Modul. Insbesondere bietet das os-Modul eine Schnittstelle zum zugrunde liegenden Betriebssystem und ermöglicht es uns, viele der Vorgänge auszuführen, die wir normalerweise in einer Befehlszeilenaufforderung ausführen.

Als solches enthält es mehrere Methoden und Eigenschaften, die aufgerufen werden können, wie wir im vorherigen Artikel erklärt haben. Wir müssen es jedoch mit dem Schlüsselwort import in unsere Umgebung importieren (oder einbinden):

>>> import os

Drucken wir das aktuelle Arbeitsverzeichnis:

>>> os.getcwd()

Lassen Sie uns nun all dies (zusammen mit den im vorherigen Artikel besprochenen Konzepten) zusammenfügen, um das gewünschte Skript zu schreiben.

Python-Skript

Es wird als bewährte Methode angesehen, ein Skript mit einer Anweisung zu beginnen, die den Zweck des Skripts, die Lizenzbedingungen, unter denen es veröffentlicht wurde, und eine Revisionshistorie angibt, in der die vorgenommenen Änderungen aufgeführt sind. Obwohl dies eher eine persönliche Präferenz ist, verleiht es unserer Arbeit eine professionelle Note.

Hier ist das Skript, das die Ausgabe erzeugt, die wir oben in diesem Artikel gezeigt haben. Es wird stark kommentiert, damit Sie verstehen können, was passiert.

Nehmen Sie sich ein paar Minuten Zeit, um es durchzugehen, bevor Sie fortfahren. Beachten Sie, wie wir eine if/else-Struktur verwenden, um zu bestimmen, ob die Länge jeder Feldbeschriftung größer ist als der Wert des Felds selbst.

Basierend auf dem Ergebnis verwenden wir leere Zeichen, um den Raum zwischen einer Feldbeschriftung und der nächsten auszufüllen. Außerdem verwenden wir die richtige Anzahl von Bindestrichen als Trennzeichen zwischen der Feldbeschriftung und ihrem Wert unten.

#!/usr/bin/python3
Change the above line to #!/usr/bin/python if you don't have Python 3 installed

Script name: uname.py
Purpose: Illustrate Python's OOP capabilities to write shell scripts more easily
License: GPL v3 (http://www.gnu.org/licenses/gpl.html)

Copyright (C) 2016 Gabriel Alejandro Cánepa
Facebook / Skype / G+ / Twitter / Github: gacanepa
Email: gacanepa (at) gmail (dot) com

This program is free software: you can redistribute it and/or modify
it is under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

REVISION HISTORY
DATE   	  VERSION AUTHOR    	 CHANGE DESCRIPTION
---------- ------- --------------
2016-05-28 1.0     Gabriel Cánepa    Initial version

Import the os module
import os

Assign the output of os.uname() to the the systemInfo variable
os.uname() returns a 5-string tuple (sysname, nodename, release, version, machine)
Documentation: https://docs.python.org/3.2/library/os.html#module-os
systemInfo = os.uname()

This is a fixed array with the desired captions in the script output
headers = ["Operating system","Hostname","Release","Version","Machine"]

Initial value of the index variable. It is used to define the
index of both systemInfo and headers in each step of the iteration.
index = 0

Initial value of the caption variable.
caption = ""

Initial value of the values variable
values = ""

Initial value of the separators variable
separators = ""

Start of the loop
for item in systemInfo:
    if len(item) < len(headers[index]):
   	 # A string containing dashes to the length of item[index] or headers[index]
   	 # To repeat a character(s), enclose it within quotes followed
   	 # by the star sign (*) and the desired number of times.
   	 separators = separators + "-" * len(headers[index]) + " "
   	 caption = caption + headers[index] + " "
   	 values = values + systemInfo[index] + " " * (len(headers[index]) - len(item)) + " "
    else:
   	 separators = separators + "-" * len(item) + " "
   	 caption =  caption + headers[index] + " " * (len(item) - len(headers[index]) + 1)
   	 values = values + item + " "
    # Increment the value of index by 1
    index = index + 1
End of the loop

Print the variable named caption converted to uppercase
print(caption.upper())

Print separators
print(separators)

Print values (items in systemInfo)
print(values)

INSTRUCTIONS:
1) Save the script as uname.py (or another name of your choosing) and give it execute permissions:
chmod +x uname.py
2) Execute it:
./uname.py

Nachdem Sie das obige Skript in einer Datei gespeichert haben, erteilen Sie ihm Ausführungsberechtigungen, und führen Sie es wie am Ende des Codes angegeben aus:

# chmod +x uname.py
./uname.py

Wenn Sie beim Versuch, das Skript auszuführen, die folgende Fehlermeldung erhalten:

-bash: ./uname.py: /usr/bin/python3: bad interpreter: No such file or directory

Das bedeutet, dass Sie Python 3 nicht installiert haben. Wenn dies der Fall ist, können Sie entweder das Paket installieren oder die Interpreterzeile ersetzen (Seien Sie besonders vorsichtig und seien Sie sehr vorsichtig, wenn Sie die Schritte zum Aktualisieren der symbolischen Links zu den Python-Binärdateien befolgt haben, wie im vorherigen Artikel beschrieben):

#!/usr/bin/python3

mit

#!/usr/bin/python

Dies führt dazu, dass die installierte Version von Python 2 stattdessen das Skript ausführt.

Hinweis: Dieses Skript wurde sowohl in Python 2.x als auch in 3.x erfolgreich getestet.

Obwohl es etwas rudimentär ist, können Sie sich dieses Skript als Python-Modul vorstellen. Das bedeutet, dass Sie es im IDLE (Datei → Öffnen... → Datei auswählen):

Es öffnet sich ein neues Fenster mit dem Inhalt der Datei. Gehen Sie dann zu Ausführen → Modul Ausführen (oder drücken Sie einfach F5). Die Ausgabe des Skripts wird in der ursprünglichen Shell angezeigt:

Wenn Sie die gleichen Ergebnisse mit einem Skript erzielen möchten, das ausschließlich in Bash geschrieben wurde, müssen Sie eine Kombination aus awk, sed verwenden und auf komplexe Methoden zurückgreifen, um Elemente in einer Liste zu speichern und abzurufen (ganz zu schweigen von der Verwendung von tr zum Konvertieren von Kleinbuchstaben in Großbuchstaben).

Darüber hinaus bietet Python Portabilität, da alle Linux-Systeme mit mindestens einer Python-Version ausgeliefert werden (entweder 2.x oder 3.x, manchmal beide). Wenn Sie sich auf eine Shell verlassen müssen, um das gleiche Ziel zu erreichen, müssen Sie verschiedene Versionen des Skripts basierend auf der Shell schreiben.

Dies zeigt, dass Funktionen der objektorientierten Programmierung zu starken Verbündeten von Systemadministratoren werden können.

Hinweis: Sie können dieses Python-Skript (und andere) in einem meiner GitHub-Repositories finden.

Zusammenfassung

In diesem Artikel haben wir die Konzepte von Ablaufsteuerung, Schleifen/Iterationen und Modulen in Python überprüft. Wir haben gezeigt, wie OOP-Methoden und -Eigenschaften in Python genutzt werden können, um ansonsten komplexe Shell-Skripte zu vereinfachen.

Haben Sie noch weitere Ideen, die Sie testen möchten? Schreiben Sie Ihre eigenen Python-Skripte und lassen Sie es uns wissen, wenn Sie Fragen haben. Zögern Sie nicht, uns eine Nachricht über das untenstehende Kommentarformular zu schreiben, und wir werden uns so schnell wie möglich bei Ihnen melden.

Verwandte Artikel: