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.

TomVienna

Anmeldungsdatum:
10. September 2018

Beiträge: Zähle...

Ich plane noch eine Verlinkung zu https://wiki.ubuntuusers.de/sudo/Konfiguration/ zu machen.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Links einfügen ist schon ok - aber wo ist der konkrete Zusammenhang zwischen dem Skripting-Guide und sudo/Konfiguration?

Gruß, noisefloor

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Durch Missverstehen des Codes nahm der User Karzer an, er müsse ein Skript korrigieren. Das die Grafiken in einem Unterunterverzeichnis liegen müssen hat er wohl übersehen. Den Artikel habe ich zurückgesetzt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for file in ./*/*.png ; do  echo "Diese Datei: $file"; fname=$(basename "$file"); echo "hat den Namen: $fname"; fdir=$(dirname "$file"); echo "und steht im Verzeichnis: $fdir"; done
Diese Datei: ./bar/a.png
hat den Namen: a.png
und steht im Verzeichnis: ./bar
Diese Datei: ./bar/b.png
hat den Namen: b.png
und steht im Verzeichnis: ./bar
Diese Datei: ./foo/a.png
hat den Namen: a.png
und steht im Verzeichnis: ./foo
Diese Datei: ./foo/b.png
hat den Namen: b.png
und steht im Verzeichnis: ./foo

tree
.
├── bar
│   ├── a.png
│   ├── baz
│   ├── b.png
│   └── foo
├── foo
│   ├── a.png
│   ├── baz
│   ├── b.png
│   └── foo
└── mit leer

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1575

Hallo,

ich würde gerne einen Abschnitt zur Benutzung der der verschiedenen Klammerarten in Bash-Skripten machen, etwa [, [[, $(, { u.a.. Passt der noch rein?

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

(Flüchtigkeitsfehler verbessert)

Zeichenketten bearbeiten

Eine in einer Variablen gespeicherten Zeichenkette (und nur solche) kann man vor der weiteren Verwendung noch modifizieren. Zusätzlich zu den oben gezeigten Möglichkeiten zum Abschneiden von Mustern kann man auch Zeichenketten mit der normalen Zeichenkettenbearbeitung einer Posix-Shell bearbeiten.

Ich frage mich, was das "(und nur solche)" heißen soll. Dass man nur Zeichenketten in Variablen ändern kann? Aber was könnte es abseits von Zeichenketten geben? Zahlen, natürlich, die aber auch Zeichenketten sind, Dateinamen, IP-Adressen, alles aus der binären Null ist letztlich eine Zeichenkette und Zahlen können ja auch bearbeitet werden. Mh.

Zeichenketten können nur insoweit (mit dieser Technik) bearbeitet werden, als sie in Variablen gespeichert sind? Aber nicht literale Zeichenketten? Das wird es sein, aber dann ist die Einzahl falsch.

In einer Variablen gespeicherte Zeichenketten (und nur solche) kann man vor der weiteren Verwendung noch modifizieren.

oder

Eine in einer Variablen gespeicherte Zeichenkette (und nur eine solche) kann man vor der weiteren Verwendung noch modifizieren.

Ja, je länger ich darüber nachdenke, desto sicherer werde ich mir, dass es so oder so gemeint ist. 😉

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

user_unknown schrieb:

[…]

Eine in einer Variablen gespeicherte Zeichenkette (und nur eine solche) kann man vor der weiteren Verwendung noch modifizieren.

Ja, je länger ich darüber nachdenke, desto sicherer werde ich mir, dass es so oder so gemeint ist.

Der Satz sollte lauten:

  • Eine in einer Variablen gespeicherten Zeichenkette (und nur eine solche) kann man vor der weiteren Verwendung noch modifizieren.

Und so steht es jetzt auch im Artikel. Danke für das aufmerksame Lesen.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1575

Noch etwas ist mir aufgefallen:

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

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

karzer schrieb:

Noch etwas ist mir aufgefallen:

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

In der Tat ein merkwürdiger Effekt! Peinlich, dass es mit Windows funktioniert:

$ y='Windows ist toll.' ; echo ${y/ist toll/wird immer besser}
Windows wird immer besser.

Aber vermutlich habe ich bei meinen Tests nur die falsche Zeile ins Wiki kopiert. Sorry.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Kritik nach Information über Bearbeitung, unabhängig davon, ob der vorige Zustand auch schon kritikwürdig war:

Zeile 99:

Der zweite Typ ist der eines Skriptes. Diese beginnen immer mit einer Shebang …

a) Der Numerus war Einzahl, also muss mit "Dieses" (Skript) oder "Dieser" (Typ) fortgesetzt werden.

b) Skripte beginnen nicht <b> immer </b> mit einem Shebang, sondern meist. Plant man, sie immer mit dem Interpreter aufzurufen, dann zum Beispiel nicht.

dito:

Diese beginnen immer mit einer Shebang Shebang, welche gleich noch erklärt wird,

einem Shebang/welcher, wie sonst im Artikel.

Zeile 134:

In vielen anderen Anleitungen findet sich jedoch /bin/sh in dem Shebang. Was hat es damit auf sich? Die Bash ist eine komplexere Shell, die nicht auf allen unixoiden Systemen zur Verfügung steht.

Zum Beispiel auf welchen nicht? Ich würde empfehlen zu schreiben: "… die nicht auf allen unixoiden Systemen installiert ist".

Z 134:

Hinsichtlich des Funktionsumfangs stimmen die von POSIX geforderte sh und die Bash aber nicht überein, Hinsichtlich des Funktionsumfangs stimmen die von POSIX geforderte sh und die Bash aber nicht überein, denn die Bash kann wesentlich mehr als sh.

Beide Shells sind turing-complete, oder, und daher kann keine etwas, das die andere nicht kann. Vorschlag: "… Hinsichtlich des Funktionsumfangs stimmen die von POSIX geforderte sh und die Bash aber nicht überein, denn die Bash hat mehr eingebaute Funktionen als sh."

Z. 795:

Die Shebang wurde bereits beschrieben, ebenso Kommentare.

Der Shebang, wie sonst im Artikel.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

user_unknown schrieb:

Kritik nach Information über Bearbeitung, unabhängig davon, ob der vorige Zustand auch schon kritikwürdig war: […]

Deine formal richtigen Kritikpunkte beziehen sich auf eine veraltete Fassung des Textes und beruhen teilweise auf einer nicht intendierten Leseweise. Ich habe sie deshalb nicht direkt in die aktuelle Fassung übernommen, sondern versucht, durch andere Formulierungen Deine aufgezeigten Missverständnisse zu verunmöglichen. Danke für Deine Mitarbeit.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Habe ich die neue mit der alten Version verwechselt? Dann tut's mir leid, sorry. Seh's mir später noch mal an.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Hi wxpte u.a.

Die neueste Änderung würde ich zurückrollen.

645 Wenn man also lieber beim Zählen mit Eins beginnt, kann man dies erreichen, indem man zunächst den Index 0 mit einem leeren (oder beliebigen anderen) Wert belegt und den Rest danach wie oben dargestellt hinzufügt:

1
2
3
unset Arrayname
Arrayname[0]=
Arrayname+=(all diese sieben Elemente werden einzeln angefügt) 

Begründung: Inhaltlich ist das zwar richtig, aber Arrays nicht bei 0 beginnen zu lassen ist prinzipiell eine schlechte Idee, die man Anfängern, an die sich die Seite richtet, nicht vermitteln sollte.

Schlecht ist die Idee deswegen, weil man das Array dann nicht mehr einfach iterieren kann

1
2
3
4
for x in "${array[@]}" 
do 
  # ...
done 

Auch kann man nicht mehr mittels Modulooperation durch das Array rotieren, da die Länge um 1 größer ist, als die Zahl der benutzbaren Elemente.

Wenn man Arrays mischt, die teils mit 0, teils mit 1 beginnen, sind Flüchtigkeitsfehler vorprogrammiert. Wenn man Codeausschnitte irgendwo (uu.de, SO, ...) bespricht muss man immer drauf hinweisen. Die Fälle, wo man die Nachteile in Kauf nimmt, weil es mit anderen Vorteilen verbunden ist, sind so selten, dass es ein Anfänger wirklich nicht braucht.

Java hatte mal etwas ähnliches in der Date- oder Kalenderklasse, wo es verständlich scheint, bei Date.MONTH(7) o.ä. erwartet man JULI - es war ein Desaster.

Beschreibt man aber die drohenden Gefahren, bläht es den Artikel auf für eine Nichtigkeit. Ich würd's rausnehmen, auch wenn ich in kurzen ad-hoc-Scripten selbst schon davon Gebrauch gemacht habe.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9837

user_unknown schrieb:

Hi wxpte u.a.

Die neueste Änderung würde ich zurückrollen. […]

Ich bin weder mit der Ergänzung von wxpte glücklich noch mit Deiner Argumentation völlig einverstanden. Du schreibst selber, dass der Beitrag von wxpte inhaltlich zutrifft. Ich stimme Dir auch zu, dass er aus den von Dir genannten didaktischen Gründen überdacht werden sollte. Meine und Deine Meinung hierzu erscheinen mir aber nicht als ausreichende Rechtfertigung für den von Dir vorgeschlagenen zensierenden Eingriff.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Ja. In den meisten Sprachen, von denen ich berichten kann, ist dieses Überdimensionieren von Arrays möglich aber keine verbreitete Praxis. Große Diskussionen dazu, die davon abraten, gibt es aber auch nicht, im Vergleich etwa zum Bannen von Switch-Statements, mehreren return-Statements in einer Methode u.a..

Wie sieht da beispielsweise in der Python- und der Javascriptwelt aus? Ist es da möglich, wird es oft gemacht?

Ich vermute ein großer Teil derjenigen, die sich die Wikiseite durchlesen, haben bereits mehr oder weniger Programmiererfahrungen mit anderen Sprachen gesammelt, wenn auch nicht unbedingt viele, gründliche, langanhaltende.

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.

Eher würde ich vorschlagen in "Programmführung" das Schlüsselwort select vorzustellen, weil es so in anderen Programmiersprachen unbekannt ist.