{"id":2076,"date":"2023-09-09T22:08:10","date_gmt":"2023-09-09T20:08:10","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=2076"},"modified":"2023-09-09T22:10:55","modified_gmt":"2023-09-09T20:10:55","slug":"skripte-unter-linux-erstellen-und-nutzen","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2023\/09\/09\/skripte-unter-linux-erstellen-und-nutzen\/","title":{"rendered":"Skripte unter Linux erstellen und nutzen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Unter Microsoft Windows nennt man sie Batch-Dateien, unter Linux Skripte &#8211; es handelt sich dabei um eine vereinfachte Form des Programmierens. Scripte sind so gesehen nichts anderes als ausf\u00fchrbare Textdateien, sie k\u00f6nnen einfache, aber auch aufwendigere Aufgaben erf\u00fcllen. Man kann sie per Mausklick, am&nbsp;Terminal&nbsp;oder auch mit grafischer Oberfl\u00e4che nutzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem fortlaufenden Beitrag sehen wir uns das Erstellen und Nutzen von Scripts unter Linux etwas n\u00e4her an. Wir werden uns hier rein mit Bash-Skripts befassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was wird ben\u00f6tigt?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Um Skripte zu erstellen braucht man nicht mehr als einen beliebigen Texteditor, ich f\u00fcr meinen Fall nutze&nbsp;Emacs, unter der Desktop-Umgebung&nbsp;KDE&nbsp;ist Kate vorinstalliert, unter&nbsp;GNOME&nbsp;Gedit und so weiter und so fort. Es gibt nat\u00fcrlich auch erweiterte Editoren und ganze Entwicklungsumgebungen (<em>IDE&#8217;s<\/em>), solche sind aber f\u00fcr reine Skripte nicht erforderlich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wie schon beschrieben sind Skripte &#8211; auch Bash-Skripte genannt nichts anderes als Textdateien, beginnen wir ganz einfach einmal. Ich erstelle eine Textdatei namens &#8222;<strong>skript.sh<\/strong>&#8220; &#8211; &#8222;<strong>.sh<\/strong>&#8220; ist die standardm\u00e4\u00dfige Dateiendung eines Skriptes, ein Skript muss aber nicht unbedingt eine Dateiendung haben, die Datei k\u00f6nnte sich auch ganz einfach &#8222;<strong>skript<\/strong>&#8220; nennen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die erste Zeile eines Bash-Skripts beginnt immer mit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Zeile nennt sich&nbsp;<strong>Shebang<\/strong>&nbsp;&#8211; diese dient dazu damit die Bash versteht worum es sich bei dieser Datei handelt, was sie damit anfangen soll. Durch diese Zeile wei\u00df die Shell &#8211; die Bash &#8211; also der Terminal-Interpreter Bash soll damit arbeiten, f\u00fcr ein Perl-Skript w\u00fcrde die Zeile in diesem Fall wie folgt lauten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/perl<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nach dem Shebang k\u00f6nnen wir schon die entsprechenden Befehle angeben und dies ist viel einfacher als bei Batch-Dateien unter Windows. Wir k\u00f6nnen jeden Befehl angeben, den wir auch auf dem Terminal nutzen k\u00f6nnen. Etwa den Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ls<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">um den Inhalt des aktuellen Verzeichnisses anzuzeigen. Der Inhalt des Skripts w\u00fcrde nun also so aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Damit das Skript ordentlich beendet wird (<em>dies sollte vor allem bei gr\u00f6\u00dferen Skripts angewendet werden<\/em>) setzt man an die letzte Stelle ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Also:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bisher haben wir jedoch nur eine reine Textdatei, diese k\u00f6nnen wir gerade einmal mit einem Texteditor \u00f6ffnen und uns den Inhalt ansehen &#8211; was wir ben\u00f6tigen ist eine ausf\u00fchrbare Textdatei. Wir machen eine Textdatei ausf\u00fchrbar, indem wir diese rechts anklicken und &#8222;<em>Eigenschaften \u2192 Berechtigungen<\/em>&#8220; \u00f6ffnen und die Checkbox &#8222;<strong>Ausf\u00fchrbar<\/strong>&#8220; aktivieren:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1024x576.jpg\" alt=\"\" class=\"wp-image-2078\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1024x576.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-300x169.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-768x432.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1536x864.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte.jpg 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ausf\u00fchrbar machen gelingt auch am Terminal mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x Dateiname<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Beispiel also:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x skript.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun k\u00f6nnen wir das Skript am Terminal starten, dies gelingt mit folgenden zwei M\u00f6glichkeiten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sh skript.sh\n.\/skript.sh<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"305\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1-1024x305.jpg\" alt=\"\" class=\"wp-image-2079\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1-1024x305.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1-300x89.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1-768x229.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1-1536x458.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-1.jpg 1692w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ist ein Skript einmal ausf\u00fchrbar gemacht, kann man es ohne Probleme weiter mit dem Texteditor bearbeiten und ausf\u00fchren, noch einmal ausf\u00fchrbar machen ist nicht n\u00f6tig.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Optionen, Verzeichnisse und Dateinamen gibt man im Befehl im Skript einfach mit an &#8211; also etwa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls -la\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nichts anderes als am Terminal also. Nun lassen sich nat\u00fcrlich auch mehrere Befehle im Skript angeben, als Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls\nls -l\nls -la\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Eine weitere Methode mehrere Befehle anzugeben w\u00e4re diese durch ein &#8222;<strong>;<\/strong>&#8220; mit Leerzeichen zu trennen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls; ls -l; ls -la\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In beiden F\u00e4llen werden die Befehle der Reihe nach abgearbeitet, der erste wird ausgef\u00fchrt, anschlie\u00dfend der zweite, es folgt der dritte und so weiter und so fort bis alle abgearbeitet wurden:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"543\" src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2-1024x543.jpg\" alt=\"\" class=\"wp-image-2080\" srcset=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2-1024x543.jpg 1024w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2-300x159.jpg 300w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2-768x407.jpg 768w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2-1536x814.jpg 1536w, https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/09\/skripte-2.jpg 1692w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Besonders bei gr\u00f6\u00dferen Skripts ist es \u00fcbersichtlicher Informationen einzuf\u00fcgen, also etwa welche Aktion an welcher Stelle ausgef\u00fchrt wird &#8211; dies gelingt, indem man der Bash zeigt, was sie ignorieren soll. Hierzu nutzt man die &#8222;<strong>#<\/strong>&#8220; &#8211; einige Beispiele:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n# Der Befehl 'ls' ohne Optionen\nls\nls -l # Der Befehl 'ls' mit einer Option\n#####################################\n# Der Befehl 'ls' mit zwei Optionen #\n#####################################\nls -la\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wie \u00fcblich lassen sich Ausgaben eines Befehls nat\u00fcrlich auch in einem Skript in eine Datei speichern &#8211; hierbei wird die Datei angelegt, wenn sie noch nicht existiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls &gt; \/home\/benutzername\/dateiname.txt\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Man nutzt ganz einfach den Operator &#8222;<strong>&gt;<\/strong>&#8222;. Besteht die Datei jedoch schon, wird diese \u00fcberschrieben, ist dies nicht erw\u00fcnscht nutzt man den Operator &#8222;<strong>&gt;&gt;<\/strong>&#8222;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\nls &gt;&gt; \/home\/benutzername\/dateiname.txt\nexit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Besteht die Datei &#8222;<strong>dateiname.txt<\/strong>&#8220; noch nicht, wird sie angelegt, besteht die Datei schon, wird die Ausgabe am Ende der Datei angeh\u00e4ngt &#8211; etwa:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Dateiname.txt<br>skripte-1.jpg<br>skripte-2.jpg<br>skripte.jpg<br>skript.sh<br>Dateiname.txt<br>skripte-1.jpg<br>skripte-2.jpg<br>skripte.jpg<br>skript.sh<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Hierbei w\u00e4re es nat\u00fcrlich hilfreich, wenn neue Eintr\u00e4ge von \u00e4lteren unterschieden werden &#8211; ideal ist hier der Befehl &#8222;<strong><code>date<\/code><\/strong>&#8220; &#8211; er gibt Datum und Uhrzeit aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\ndate &gt;&gt; \/home\/benutzername\/dateiname.txt\nls &gt;&gt; \/home\/benutzername\/dateiname.txt\nexit<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">So 03 Okt 2021 15:43:05 CEST<br>Dateiname.txt<br>skripte-1.jpg<br>skripte-2.jpg<br>skripte.jpg<br>skript.sh<br>So 03 Okt 2021 15:43:06 CEST<br>Dateiname.txt<br>skripte-1.jpg<br>skripte-2.jpg<br>skripte.jpg<br>skript.sh<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Nun haben wir noch ein kleines Problem, unser Skript ist nicht gerade sehr mobil. Nehmen wir einmal an, das Skript liegt im Home-Verzeichnis unter &#8222;<em>\/home\/robert\/skripte\/skript.sh<\/em>&#8222;, ich m\u00f6chte das Skript jedoch unter &#8222;<em>\/home\/robert\/Dokumente\/<\/em>&#8220; nutzen &#8211; ich m\u00fcsste den kompletten Pfad zum Skript angeben, also in diesem Fall:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sh \/home\/robert\/skripte\/skript.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Selbst abgek\u00fcrzt noch sehr umst\u00e4ndlich:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sh ~\/skripte\/skript.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Es geht viel einfacher &#8211; verschieben Sie das Skript am Terminal als&nbsp;Administrator&nbsp;etwa in das Systemverzeichnis &#8222;<em>\/usr\/bin\/<\/em>&#8222;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mv skripte.sh \/usr\/bin\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun liegt das Skript in einem Verzeichnis, in dem die Bash nach ausf\u00fchrbaren Dateien sucht. Egal in welchem Verzeichnis Sie sich auf dem Terminal nun befinden &#8211; Sie k\u00f6nnen das Skript ganz einfach mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>skript.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">starten.&nbsp;<strong>Wichtig<\/strong>&nbsp;nat\u00fcrlich &#8211; Sie verschieben das Skript als Administrator und der Befehl &#8222;<strong><code>mv<\/code><\/strong>&#8220; fragt nicht nach, ob er eine eventuell gleichnamige Datei \u00fcberschreiben soll oder nicht &#8211; sehen Sie zuerst nach, ob eine gleichnamige Datei schon im Verzeichnis vorhanden ist.<\/p>\n<div class=\"pld-like-dislike-wrap pld-custom\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir\" data-post-id=\"2076\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Hoch.png\" alt=\"Gef\u00e4llt mir\" \/>\r\n            <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">10    <\/span>\r\n<\/div><div class=\"pld-dislike-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-dislike-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir nicht\" data-post-id=\"2076\" data-trigger-type=\"dislike\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Runter.png\" alt=\"Gef\u00e4llt mir nicht\" \/>\r\n            <\/a>\r\n    <span class=\"pld-dislike-count-wrap pld-count-wrap\">2<\/span>\r\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Unter Microsoft Windows nennt man sie Batch-Dateien, unter Linux Skripte &#8211; es handelt sich dabei um eine vereinfachte Form des Programmierens. Scripte sind so gesehen nichts anderes als ausf\u00fchrbare Textdateien, sie k\u00f6nnen einfache, aber auch aufwendigere Aufgaben erf\u00fcllen. Man kann sie per Mausklick, am&nbsp;Terminal&nbsp;oder auch mit grafischer Oberfl\u00e4che nutzen. In diesem fortlaufenden Beitrag sehen wir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2086,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[49],"class_list":["post-2076","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entwicklung","tag-entwicklung"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2076","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=2076"}],"version-history":[{"count":2,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2076\/revisions"}],"predecessor-version":[{"id":2085,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/2076\/revisions\/2085"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/2086"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=2076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=2076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=2076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}