Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
02.08.2021, 08:56:27

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
  • Mitglieder insgesamt: 25795
  • Letzte: batou
Statistiken
  • Beiträge insgesamt: 747860
  • Themen insgesamt: 60164
  • Heute online: 392
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online

Autor Thema:  bash, Coderevision: Zum Zwecke der Fehlerminimierung, Erhöhung von Robustheit  (Gelesen 1330 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Hallo,

ich habe mittlerweile einiges an bash Code. Vieles davon ist sicherlich verbesserungswürdig. Ich möchte gerne nach und nach immer mal wieder ein von mir verwendetes Codestückchen hier ein stellen und hoffe das da jemand rüber gucken kann. Alle besagten Codestücke funktionieren erst einmal. Es geht um Verbesserungen die die Robustheit und Fehleranfälligkeit minimieren.

Codestück 001:
# Variabeln
# sleep=5

# Funktion fkt_sleep_echo_echo
fkt_sleep_echo_echo() {
        sleepdauer=$1
        echo "sleep" "$sleep"
        sleep "$sleepdauer"
        echo
        echo
    }

# Aufruf:
fkt_sleep_echo_echo $sleep

« Letzte Änderung: 01.02.2021, 13:10:05 von Jan.Tenner »

TI99-4A

  • Gast
Ich würde als kleine Verbesserung das doppelte echo so ersetzen:
echo -e "\n\n"Parameter -e bewirkt, das ANSI-Steuerzeichen verwendet werden dürfen, wobei \n jeweils ein Zeilenvorschub ausgibt.

Codestück 002:

Erzeugung einer Zufallszahl, in einem Bereich
#########################
    ug_zufallszahl=1 # Untere Grenze der zu erzeugenden Zufallszahl
    og_zufallszahl=20 # Obere Grenze der zu erzeugenden Zufallszahl

    zufallszahl=$((RANDOM%($og_zufallszahl-$ug_zufallszahl+1)+$ug_zufallszahl))
    echo Die Zufallszahl lautet":" "$zufallszahl"

Ist z.B. folgendes besser ?

ug_zufallszahl=1 # Untere Grenze der zu erzeugenden Zufallszahl
og_zufallszahl=20 # Obere Grenze der zu erzeugenden Zufallszahl

zufallszahl="$((RANDOM%($og_zufallszahl-$ug_zufallszahl+1)+$ug_zufallszahl))"
echo Die Zufallszahl lautet":" "$zufallszahl"
« Letzte Änderung: 31.01.2021, 13:23:04 von Jan.Tenner »

Es geht um Verbesserungen die die Robustheit und Fehleranfälligkeit minimieren.

Codestück 001:
Wäre schön, wenn du vollständigen Code am Stück zeigst, den man einfach ausführen kann.

Hier kannst du Skripte prüfen https://www.shellcheck.net

Unglücklich finde ich hier die Verwendung von $sleep zusammen mit $sleepdauer, deswegen:
#!/bin/sh
# Funktion fkt_sleep_echo_echo
fkt_sleep_echo_echo() {
    sleepdauer=$1
    echo "sleep" "$sleep"
    sleep "$sleepdauer"
    echo
    echo
}
sleep=5
fkt_sleep_echo_echo 15

Codestück 002:

Erzeugung einer Zufallszahl, in einem Bereich
Ein paar Leerzeichen helfen mir bei der Lesbarkeit:
#!/bin/bash
ug_zufallszahl=7 # Untere Grenze der zu erzeugenden Zufallszahl
og_zufallszahl=23 # Obere Grenze der zu erzeugenden Zufallszahl
zufallszahl=$(( $ug_zufallszahl + RANDOM % ( $og_zufallszahl - $ug_zufallszahl + 1 ) ))
echo "Die Zufallszahl lautet:" $zufallszahl

Hier kannst du Skripte prüfen https://www.shellcheck.net
Da hast du mir ja etwas gezeigt. Das ist sehr hilfreich für mich. Ich bin nun seit etlichen Stunden mit Begeisterung dabei bestehenden Code damit durch zu sehen und eine beachtliche Anzahl von Fehlern in diesem und jenen Code zu korrigieren. Mittlerweile bin ich mit den Dank "Shellchek" offensichtlichen und selbst lösbaren Punkten halbwegs durch. Dann widme ich mich den Punkten, wo die Verbesserungen für mich nicht so offensichtlich sind.

Erfahrungswerte bei der Verwendung von Shellcheck:

== Ausführung Online ==
* Shellcheck ist online über https://www.shellcheck.net verwendbar ohne es selbst zu installieren

== Ausführung Lokal ==
* man kann Shellcheck auch lokal auf dem eigenen Rechner unter LM20.x über die Anwendungsverwaltung installieren
*wenn man shellcheck lokal über die Konsole aus führt, geht das wie folgt

cd pfad_zum_zu_testenden_script
shellcheck -x name_des_zu_testenden_scripts

Begehrlichkeiten die sich aus obiger Erfahrung ergeben:
* evtl. gibt es ein Plugin mit dessen Hilfe man Shellcheck in XED integrieren kann
* evtl. gibt es vergleichbare Lösungen für Python Code
* Und was ist eigentliche eine IDE ? Sind das Dinge die Leute die sich schon länger mit Programmierung beschäftigen mit einer IDE erledigen und gibt es eine IDE die man unter LM, für bash und vlt. sogar auch Python verwenden kann ?

« Letzte Änderung: 01.02.2021, 13:07:18 von Jan.Tenner »

Begehrlichkeiten die sich aus obiger Erfahrung ergeben:
* evtl. gibt es ein Plugin mit dessen Hilfe man Shellcheck in XED integrieren kann
* evtl. gibt es vergleichbare Lösungen für Python Code
* Und was ist eigentliche eine IDE ? Sind das Dinge die Leute die sich schon länger mit Programmierung beschäftigen mit einer IDE erledigen und gibt es eine IDE die man unter LM, für bash und vlt. sogar auch Python verwenden kann ?
So viele Fragen auf einmal.
Zu XED und verfügbaren Plugins kann ich nicht helfen.
Für Python gibt es bspw. pylint in den Quellen.
Für Python gibt es z.B. die IDE PyCharm https://www.jetbrains.com/pycharm/ - kenne ich aber nicht näher; verwende ich persönlich nicht.
Ich selbst verwende Visual Studio Code https://code.visualstudio.com/ mit Plugins. Hier die Einstiegsdoku https://code.visualstudio.com/docs/python/python-tutorial zu Python in VSCode. Die Code Prüfung bezeichnet man als Linting. Die Python Erweiterung https://marketplace.visualstudio.com/items?itemName=ms-python.python integriert auch Linting - bspw. pylint.
shellcheck gibt es auch als Erweiterung für VSCode https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck - wusste ich bis eben auch nicht.
Eine IDE bietet ggü. einem einfachen Editor einen erweiterten Funktionsumfang: Angefangen bei der Verwaltung mehrerer Dateien in einem Projekt, über Syntax Highlighting, Code Completion, Code Analyse, Debugging u.a.

$ shellcheck -V
  ShellCheck - shell script analysis tool
  version: 0.3.7
  license: GNU Affero General Public License, version 3
  website: http://www.shellcheck.net
Usage: shellcheck [OPTIONS...] FILES...
  -e CODE1,CODE2..  --exclude=CODE1,CODE2..  exclude types of warnings
  -f FORMAT         --format=FORMAT          output format
  -s SHELLNAME      --shell=SHELLNAME        Specify dialect (bash,sh,ksh)
  -V                --version                Print version information

Codestück 002:

Erzeugung einer Zufallszahl, in einem Bereich
Ein paar Leerzeichen helfen mir bei der Lesbarkeit:
#!/bin/bash
ug_zufallszahl=7 # Untere Grenze der zu erzeugenden Zufallszahl
og_zufallszahl=23 # Obere Grenze der zu erzeugenden Zufallszahl
zufallszahl=$(( $ug_zufallszahl + RANDOM % ( $og_zufallszahl - $ug_zufallszahl + 1 ) ))
echo "Die Zufallszahl lautet:" $zufallszahl

Obige Variante bringt per shellcheck folgende Anmerkungen:
zufallszahl=$(( $ug_zufallszahl + RANDOM % ( $og_zufallszahl - $ug_zufallszahl + 1 ) ))
                ^-- SC2004: $/${} is unnecessary on arithmetic variables.
                                             ^-- SC2004: $/${} is unnecessary on arithmetic variables.
                                                               ^-- SC2004: $/${} is unnecessary on arithmetic variables.

Die Fehlernummer linkt in der Onlineversion zu folgender Fehlerbeschreibung, die mir jedoch nichts sagt:
* https://github.com/koalaman/shellcheck/wiki/SC2004
« Letzte Änderung: 01.02.2021, 14:12:48 von Jan.Tenner »

Obige Variante bringt per shellcheck folgende Anmerkungen:
zufallszahl=$(( $ug_zufallszahl + RANDOM % ( $og_zufallszahl - $ug_zufallszahl + 1 ) ))
                ^-- SC2004: $/${} is unnecessary on arithmetic variables.
                                             ^-- SC2004: $/${} is unnecessary on arithmetic variables.
                                                               ^-- SC2004: $/${} is unnecessary on arithmetic variables.
Das $ Zeichen für die Variablen in der arithmetischen Operation ist unnötig
zufallszahl=$(( ug_zufallszahl + RANDOM % ( og_zufallszahl - ug_zufallszahl + 1 ) ))

Das $ Zeichen für die Variablen in der arithmetischen Operation ist unnötig
Code: [Auswählen]

zufallszahl=$(( ug_zufallszahl + RANDOM % ( og_zufallszahl - ug_zufallszahl + 1 ) ))

Genial. Von dem Lösungsmuster entsprechenden Code habe ich noch einiges da. Das werde ich erst einmal alles weg arbeiten und dann sehen was dann noch so für Perlen übrig bleiben.

Dank Shellcheck habe ich einiges an Code weg arbeiten können. Nun habe ich ein paar Codestücke bei denen ich bisher keine Anpassungen für den nach meiner bisherigen Ansicht fehlerfreien Code gefunden habe, der aber bei genaueren Hinsehen mit Shellcheck sehr wohl zu Hinweisen oder Fehlermeldungen führt.

Codestück 003:
#!/bin/bash

echo tritratrallala
echo
echo

read -p "Zum Beenden Enter drücken oder Ctl + C"

Fehlermeldung mit Shellcheck:
read -p "Zum Beenden Enter drücken oder Ctl + C"
^-- SC2162: read without -r will mangle backslashes.

Link zur Fehlererklärung:
https://github.com/koalaman/shellcheck/wiki/SC2162

Wenn ich nun wie das -p durch ein -r erweitere oder ersetze, befreit mich das nicht wie vermutet von dem Hinweis, den ich bei der Kontrolle durch Shellcheck erhalte.

Nachtrag:
Jetzt habe ich die folgende Lösung gefunden, bei der Shellcheck keinen Fehler reportet:
#!/bin/bash

echo tritratrallala
echo
echo

echo Zum Beenden Enter drücken oder Ctl + C; read -r

Dann werde ich mich den nächsten noch offenen unsauberen Codestücken widmen.
« Letzte Änderung: 02.02.2021, 20:55:37 von Jan.Tenner »

read -p "Zum Beenden Enter drücken oder Ctl + C"
^-- SC2162: read without -r will mangle backslashes.

Link zur Fehlererklärung:
https://github.com/koalaman/shellcheck/wiki/SC2162

Wenn ich nun wie das -p durch ein -r erweitere oder ersetze, befreit mich das nicht wie vermutet von dem Hinweis, den ich bei der Kontrolle durch Shellcheck erhalte.
Es geht prinzipiell darum, wie read den backslash interpretiert - ist er Teil der zu lesenden Eingabe oder maskiert er das nachfolgende Zeichen. Im speziellen würde / müsste ich das auch testen oder ausprobieren. Interessant wird das dann, wenn du die Eingabe annimmst und weiter verarbeiten willst. Dir geht es m.E. vielmehr um einen Tastendruck bevor das Terminal schließt. Dann sollte das auch egal sein. Du bist auch nicht gezwungen, alle shellcheck Hinweise anzunehmen und umzusetzen. Nimm aber gerne einfach read -pr.
Letzteres kann ich nicht nachvollziehen. Ggf. hast du vergessen, zu speichern.

Nimm aber gerne einfach read -pr.
Die folgende Variante bringt zwar im Online Shellsheck keinen Fehler oder Hinweis, fürt aber lokal ausgeführt nicht zu dem im konkreten Fall von mir beabsichtigten Ausschrift "Zum Beenden Enter drücken oder Ctl + C" und dem Offen halten des Terminal Fensters, so lange keine entsprechende Eingabe von "Enter" oder "Ctrl+C" erfolgt.

#!/bin/bash

echo tritratrallala
echo
echo

read -pr "Zum Beenden Enter drücken oder Ctl + C"

Wenn du zufrieden bist - wenn deine Anwendung macht, was du beabsichtigst, ist alles OK.
Wie gesagt, es gibt keine Pflicht, den Hinweisen der Prüfung durch shellcheck zu folgen.