staging.inyokaproject.org

Shell/Bash-Skripting-Guide für Anfänger

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels Shell/Bash-Skripting-Guide_für_Anfänger.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

user_unknown schrieb:

[…] Obwohl es nicht falsch ist würde ich es aus der Übersicht für Anfänger raushalten, weil weniger oft mehr ist. Man könnte so viele Techniken, so viele Grenzsituationen darstellen, kompliziertes Quoting, all die Einstellungen und Schlüsselwörter abhandeln; das ufert leicht aus.

Ja, eine valide Meinung. Andererseits ist ein Wiki ein kooperatives Gemeinschaftswerk und den sachlich richtigen Beitrag eines Benutzers zu unterdrücken deshalb unzulässig. Man kann eben unterschiedlicher Meinung sein, ob dieser spezielle Sachverhalt für Anfänger taugt oder nicht.

Es gibt kein festgelegtes Kriterium, was „für Anfänger“ definitiv bedeuten soll und somit in diesen Artikel gehört oder nicht. Eine Möglichkeit für eine Abgrenzung wäre, den Artikel zu überarbeiten und in zwei zu splitten, z.B.:

  1. Bash-Skripting-Guide für Anfänger

  2. Bash-Skripting-Guide für Fortgeschrittene

Der Artikel „für Anfänger“ würde dann für allgemeine Bearbeitung schreibgeschützt und damit das Niveau für Anfänger festgeschrieben. Ich werde nach meinem Urlaub den Gedanken weiter verfolgen und es müsste zu dieser Vorgehensweise auch ein Einvernehmen im Wiki-Team bestehen.

Eher würde ich vorschlagen in "Programmführung" das Schlüsselwort select vorzustellen

Sehe ich eher unter „Interaktion mit dem Benutzer“.

weil es so in anderen Programmiersprachen unbekannt ist.

Was zutrifft, aber kein Argument für „Anfänger-Niveau“ darstellt. Vielleicht gehört das doch eher in den noch nicht existierenden Artikel „Bash-Skripting-Guide für Fortgeschrittene“? Grundsätzlich sind aber Erweiterungen des Wikis durch willige und kompetente Autoren willkommen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

kB schrieb:

user_unknown schrieb:

[…] Obwohl es nicht falsch ist würde ich es aus der Übersicht für Anfänger raushalten, weil weniger oft mehr ist. Man könnte so viele Techniken, so viele Grenzsituationen darstellen, kompliziertes Quoting, all die Einstellungen und Schlüsselwörter abhandeln; das ufert leicht aus.

Ja, eine valide Meinung. Andererseits ist ein Wiki ein kooperatives Gemeinschaftswerk und den sachlich richtigen Beitrag eines Benutzers zu unterdrücken deshalb unzulässig. Man kann eben unterschiedlicher Meinung sein, ob dieser spezielle Sachverhalt für Anfänger taugt oder nicht.

Deswegen habe ich ja nicht den Artikel zurückgerollt und eine Änderungsnotiz hinterlassen, sondern meine Kritik hier in den Diskussionsartikel eingebracht - ich dachte wxpte würde hier mitlesen und sich dann melden, ich sollte ihn per PM zu diesem Thread einladen.

Es gibt kein festgelegtes Kriterium, was „für Anfänger“ definitiv bedeuten soll und somit in diesen Artikel gehört oder nicht. Eine Möglichkeit für eine Abgrenzung wäre, den Artikel zu überarbeiten und in zwei zu splitten, z.B.:

  1. Bash-Skripting-Guide für Anfänger

  2. Bash-Skripting-Guide für Fortgeschrittene

Ach Du liebe Zeit! ☺

Ich meine, es gibt ja einiges an freiem Material zum Bashscripten, manche Verlage haben ältere Versionen ihrer Bücher online, es gibt eigene Foren, SO, SE, zugegeben mehr auf Englisch. Man könnte endlos diskutieren, was zum Anfänger- und was zum Fortgeschrittenenstoff gehört und die Frage mit der Indizierung von Arrays ist auch nichts, was sich an der Demarkationslinie entzündet, sondern ob es guter Stil ist oder nicht.

Der Artikel „für Anfänger“ würde dann für allgemeine Bearbeitung schreibgeschützt und damit das Niveau für Anfänger festgeschrieben. Ich werde nach meinem Urlaub den Gedanken weiter verfolgen und es müsste zu dieser Vorgehensweise auch ein Einvernehmen im Wiki-Team bestehen.

Eher würde ich vorschlagen in "Programmführung" das Schlüsselwort select vorzustellen

Sehe ich eher unter „Interaktion mit dem Benutzer“.

weil es so in anderen Programmiersprachen unbekannt ist.

Was zutrifft, aber kein Argument für „Anfänger-Niveau“ darstellt. Vielleicht gehört das doch eher in den noch nicht existierenden Artikel „Bash-Skripting-Guide für Fortgeschrittene“? Grundsätzlich sind aber Erweiterungen des Wikis durch willige und kompetente Autoren willkommen.

Interaktion m.d. Benutzer ist aber auch kein Kriterium für Anf./Fortg. . Von der Struktur her ist es eine Verzweigung, ähnlich dem case-Statement, auch wenn es auch mit dem read verwandt ist. Und mir ist auch klar, dass es orthogonal zur Frage ist, ob man jetzt Arrays ab 1 diskutiert oder nicht und dass der, dem es zuerst fehlt, derjenige sein sollte, der sich überlegt, ob er es ergänzt. 😉

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

user_unknown schrieb:

... - ich dachte wxpte würde hier mitlesen und sich dann melden, ich sollte ihn per PM zu diesem Thread einladen.

Ja, den Beginn der Diskussion habe ich gestern Abend entdeckt, war zu diesem Zeitpunkt aber nicht mehr richtig aufnahmefähig (es war spät). Hmm, den Thread habe ich eigentlich schon seit längerem abonniert, da hätte doch auch eine Mail kommen müssen ....

Grundsätzlich war es mir erst einmal nicht bewusst, dass der Shift der Arrays um einen Zähler solche Probleme nach sich ziehen könnte; dass viele User Arrays zum Iterieren verwenden, hatte ich gar nicht auf dem Radar.

Dabei muss ich auch zugeben, dass ich in meinen Skripten den Array gar nicht auf die gezeigte Weise hochsetze, sondern mit dem Kommando readarray -O1. Ich hatte nur, nachdem ich diese Option entdeckt hatte, nochmals unter dem Abschnitt "Arrays" nachgelesen und ausprobiert, ob so etwas mit der eingeklammerten Zeile auch möglich ist. Da dies der Fall ist, wollte ich das Ergebnis dann auch der Community zukommen lassen.

Der Hintergrund, warum ich so etwas (Hochsetzen der Indizes) überhaupt mache, ist die Uneinheitlichkeit des Systems: das Kommando cut zählt die Felder ab Eins, die Parameter auch ($0 hat ja eine Sonderfunktion). Wenn ich dann während des Skriptens schnell in der strukturierten Datendatei etwas nachschauen möchte, greife ich meistens mit cut auf das betreffende Feld zu. Ich habe bis heute nicht verstanden, warum man es sich hat einfallen lassen, bei der Zählung von Arrayindizes mit Null zu beginnen, während man ansonsten die Eins als ersten Zähler verwendet.

Im Grunde genommen habt ihr aber beide Recht: zum Kernbereich eines Skripting-Guides gehört es wahrhaftig nicht. Daher mein Vorschlag: ich würde die Passage wieder aus dem Guide entfernen, ein wenig umformulieren und bei Tipps und Tricks an geeigneter Stelle unterbringen. Das schaffe ich aber frühestens heute Abend.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

wxpte schrieb:

Ich habe bis heute nicht verstanden, warum man es sich hat einfallen lassen, bei der Zählung von Arrayindizes mit Null zu beginnen, während man ansonsten die Eins als ersten Zähler verwendet.

Ich vermute, weil im Speicher der Start des Arrays hinterlegt ist, und arr[i] dann leicht u. schnell an der Stelle arr[0] + (i * Elementsize) gefunden werden kann.

Im Grunde genommen habt ihr aber beide Recht: zum Kernbereich eines Skripting-Guides gehört es wahrhaftig nicht. Daher mein Vorschlag: ich würde die Passage wieder aus dem Guide entfernen, ein wenig umformulieren und bei Tipps und Tricks an geeigneter Stelle unterbringen. Das schaffe ich aber frühestens heute Abend.

Schön, dass Du reagiert hast und bei Tipps/Tricks ist es m.E. auch besser platziert. Eile hat es wohl nicht, wer weiß wie oft jmd. das überhaupt durcharbeitet.

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Done.

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10477

Hallo in die Runde,

in diesem Abschnitt Shell/Bash-Skripting-Guide für Anfänger (Abschnitt „Variablen“) wird das folgende Beispiel genannt:

date +%A 

Der Parameter %A zeigt den ausgeschriebene Wochentag an

Meine Frage, so steht eine Erklärung für das +

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

In der manpage wird die Syntax wie folgt angezeigt:

date [OPTION]… [+FORMAT]

Formatangaben werden also grundsätzlich mit einem + eingeleitet. Die Befehlsübersicht verweist auf die manpage.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

Berlin_1946 schrieb:

[…] Meine Frage, so steht eine Erklärung für das +

Das ist eine Besonderheit des Befehls date und natürlich in der Manpage von date erklärt.

Im angesprochenen Abschnitt des Wiki-Artikels geht es aber gar nicht um den Befehl date, sondern wie man unter Verwendung von Umgebungsvariablen die Ausgabe eines Befehls ändern kann. Vielleicht ist es nicht so geschickt, dafür ein selbst erklärungsbedürftiges Beispiel zu wählen.

Wenn jemand einen Wiki-Artikel zu date schreiben möchte, könnte man das Beispiel dahin verschieben oder den neuen Wiki-Artikel hier verknüpfen.

Ein anderes Beispiel für den hier erklärten Gebrauch wäre z.B.:

man man 

versus

LANG=C man man 

(Aber date als Beispiel ist natürlich hier cooler.)

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

kB schrieb:

Wenn jemand einen Wiki-Artikel zu date schreiben möchte, könnte man das Beispiel dahin verschieben oder den neuen Wiki-Artikel hier verknüpfen.

Eigentlich benutze ich diesen Befehl schon recht häufig (auch in meinen Skripten). So ein paar interessante Dinge ließen sich da schon ausführen; und wenn ich mir zum Vergleich den Artikel zu cat ansehe, dann ließe sich da schon etwas machen.

Ich werde mir mal ein paar Gedanken machen, ob ich genügend Material zusammen bekomme, das wesentlich über die recht anschaulich beschriebene manpage hinausreicht. Den Rest erledigt dann (hoffentlich) die Schwarmintelligenz.

Wenn ich zu dem Schluss komme, dass sich ein eigener Artikel zu date lohnt, dann melde ich mich.

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10477

kB schrieb:

Vielleicht ist es nicht so geschickt, dafür ein selbst erklärungsbedürftiges Beispiel zu wählen.

100% mein Anliegen. 👍

date +%A 

Der Parameter %A zeigt den ausgeschriebene Wochentag an

Mein Vorschlag:

date +%A 

Der Befehl date benötigt ein + vor den Parametern. %A ist der Parameter für den ausgeschriebene Wochentag. Weitere Informationen findet man in der Befehlsübersicht

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Berlin_1946 schrieb:

Der Befehl date benötigt ein + vor den Parametern.

Besser: den Formatierungsparametern. Die anderen Parameter (z. B. Optionen) folgen dagegen den gewohnten Regeln.

Gegenvorschlag:

date +%A 

Formatangaben beim Befehl date muss ein + vorangestellt werden, %A steht für den ausgeschriebenen Wochentag. Weitere Informationen findet man in der Befehlsübersicht

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3351

Dieses Beispiel unter Shell/Bash-Skripting-Guide fC3BCr AnfC3A4nger (Abschnitt „Zeichenketten-bearbeiten“) funktioniert nicht, denn:

$ x='Das UbuntuUsers.de-Wiki ist toll.'
$ echo ${x/./ und wird immer besser.} 
Das UbuntuUsers und wird immer besser.de-Wiki ist toll.

Insofern wäre es interessant noch anzuführen, was man tun muss, wenn man das letzte passende Muster ersetzen will.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

UlfZibis schrieb:

Dieses Beispiel unter Shell/Bash-Skripting-Guide fC3BCr AnfC3A4nger (Abschnitt „Zeichenketten-bearbeiten“) funktioniert nicht, …

Insofern wäre es interessant noch anzuführen, was man tun muss, wenn man das letzte passende Muster ersetzen will.

Ersetzt mit:

Natürlich kann man auch längere Such-/Ersatzbegriffe verwenden und der Ersatzbegriff darf auch leer sein, was zur Löschung des Suchbegriffs führt.

Mit ${v/#x/y} ersetzt man in der Variablen v x durch y nur, wenn x am Anfang der Zeichenkette steht, mit ${v/%x/y} nur am Ende:

v=nennen
echo $v ${v/#n/k} ${v/%n/r}
# nennen kennen nenner 

Das ist zwar nicht erstes/letztes Match, sondern Match am Zeichenkettenbeginn/-ende, aber dafür funktioniert/stimmt es. Auch der Doppelpunkt vor dem Code wurde entfernt, denn da kam ja kein Beispiel für einen leeren Ersetzungsstring.

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3351

user_unknown schrieb:

Ersetzt mit:

Natürlich kann man auch längere Such-/Ersatzbegriffe verwenden und der Ersatzbegriff darf auch leer sein, was zur Löschung des Suchbegriffs führt.

Jetzt fehlt aber ein Beispiel für längere Suchbegriffe, find' ich schade. Wie wär's mit:

Natürlich kann man auch längere Such-/Ersatzbegriffe verwenden (der Ersatzbegriff darf auch leer sein, was zur Löschung des Suchbegriffs führt):

x='Das UbuntuUsers.de-Wiki ist toll.'
echo ${x/toll/toll und wird immer besser} 
Das UbuntuUsers.de-Wiki ist toll und wird immer besser.

Mit ${v/#x/y} ersetzt man in der Variablen v x durch y nur, wenn x am Anfang der Zeichenkette steht, mit ${v/%x/y} nur am Ende:

Toll, dass Du das herausgefunden hast (ich konnte im Netz nämlich nix dergleichen finden), und schönes Beispiel.

Auch der Doppelpunkt vor dem Code wurde entfernt, denn da kam ja kein Beispiel für einen leeren Ersetzungsstring.

Da steht ja nicht nur was von "leerem Ersetzungsstring".

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

RTFM: ☺

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
       ${parameter/pattern/string}
       ${parameter//pattern/string}
       ${parameter/#pattern/string}
       ${parameter/%pattern/string}
              Pattern substitution.  The pattern is expanded to produce a pattern just as  in  pathname  expansion.
              Parameter  is  expanded  and  the longest match of pattern against its value is replaced with string.
              string undergoes tilde expansion, parameter and variable expansion, arithmetic expansion, command and
              process substitution, and quote removal.  The match is performed using the rules described under Pat‐
              tern Matching below.  In the first form above, only the first match is replaced.  If  there  are  two
              slashes separating parameter and pattern (the second form above), all matches of pattern are replaced
              with  string.   If pattern is preceded by # (the third form above), it must match at the beginning of
              the expanded value of parameter.  If pattern is preceded by % (the fourth form above), it must  match
              at  the  end of the expanded value of parameter.  If the expansion of string is null, matches of pat‐
              tern are deleted.  If string is null, matches of pattern are deleted and the / following pattern  may
              be omitted.

Wenn Du den Doppelpunkt wieder einfügst werde ich keinen Editwar führen. Das letzte Statement ist zum Leerstring, allerdings ist es eingeklammert.

Zwei Absätze weiter oben ("Abschneiden von Mustern") sind die Schnittmöglichkeiten mit einem längeren Suchstring gezeigt worden.