Merge pull request #1453 from guntbert/issue1452

[bash/de] #1452 Several sections need to be translated
This commit is contained in:
ven 2015-10-20 21:46:45 +02:00
commit 5fb5dd7c7f
2 changed files with 223 additions and 30 deletions

View File

@ -28,18 +28,50 @@ echo Hello, world!
echo 'Dies ist die erste Zeile'; echo 'Dies die zweite Zeile' echo 'Dies ist die erste Zeile'; echo 'Dies die zweite Zeile'
# Variablen deklariert man so: # Variablen deklariert man so:
VARIABLE="irgendein String" Variable="irgendein String"
# Aber nicht so: # Aber nicht so:
VARIABLE = "irgendein String" Variable = "irgendein String"
# Bash wird VARIABLE für einen Befehl halten, den es ausführen soll. Es wird einen Fehler ausgeben, # Bash wird 'Variable' für einen Befehl halten, den es ausführen soll. Es wird einen Fehler ausgeben,
# weil es den Befehl nicht findet. # weil es den Befehl nicht findet.
# Und so auch nicht:
Variable= 'Some string'
# Bash wird 'Variable' wieder für einen Befehl halten, den es ausführen soll. Es wird einen Fehler ausgeben,
# Hier wird der Teil 'Variable=' als nur für diesen einen Befehl gültige Zuweisung an die Variable gesehen.
# Eine Variable wird so benutzt: # Eine Variable wird so benutzt:
echo $VARIABLE echo $Variable
echo "$VARIABLE" echo "$Variable"
# Wenn du eine Variable selbst benutzt ihr Werte zuweist, sie exportierst oder irgendetwas anders , echo ${Variable}
# aber
echo '$Variable'
# Wenn du eine Variable selbst benutzt ihr Werte zuweist, sie exportierst oder irgendetwas anderes ,
# dann über ihren Namen ohne $. Aber wenn du ihren zugewiesenen Wert willst, dann musst du $ voranstellen. # dann über ihren Namen ohne $. Aber wenn du ihren zugewiesenen Wert willst, dann musst du $ voranstellen.
# Beachte: ' (Hochkomma) verhindert das Interpretieren der Variablen
# Ersetzen von Zeichenketten in Variablen
echo ${Variable/irgendein/neuer}
# Ersetzt das erste Vorkommen von "irgendein" durch "neuer"
# Teil einer Zeichenkette
Laenge=7
echo ${Variable:0:Laenge}
# Gibt nur die ersten 7 Zeichen zurück
# Standardwert verwenden
echo ${Foo:-"ErsatzWennLeerOderUngesetzt"}
# Das funktioniert mit nicht gesetzten Variablen (Foo=) und leeren Zeichenketten (Foo="")
# Die Zahl 0 (Foo=0) liefert 0.
# Beachte: der wert der Variablen wird nicht geändert
# Eingebaute Variable (BUILTINS):
# Einige nützliche Beispiele
echo "Rückgabewert des letzten Befehls: $?"
echo "Die PID des skripts: $$"
echo "Anzahl der Argumente beim Aufruf: $#"
echo "Alle Argumente beim Aufruf: $@"
echo "Die Argumente in einzelnen Variablen: $1 $2..."
# Einen Wert aus der Eingabe lesen: # Einen Wert aus der Eingabe lesen:
echo "Wie heisst du?" echo "Wie heisst du?"
@ -47,14 +79,30 @@ read NAME # Wir mussten nicht mal eine neue Variable deklarieren
echo Hello, $NAME! echo Hello, $NAME!
# Wir haben die übliche if-Struktur: # Wir haben die übliche if-Struktur:
if true # 'man test' liefert weitere Informationen zu Bedingungen
if [ "$NAME" -ne $USER ]
then then
echo "Wie erwartet" echo "Dein Name ist nicht dein Login-Name"
else else
echo "Und dies nicht" echo "Dein Name ist dein Login-Name"
fi fi
# Ausdrücke werden im folgenden Format festgehalten: # Es gibt auch bedingte Ausführung
echo "immer ausgeführt" || echo "Nur ausgeführt wenn der erste Befehl fehlschlägt"
echo "immer ausgeführt" && echo "Nur ausgeführt wenn der erste Befehl Erfolg hat"
# Um && und || mit if statements zu verwenden, braucht man mehrfache Paare eckiger Klammern:
if [ $NAME == "Steve" ] && [ $Alter -eq 15 ]
then
echo "Wird ausgeführt wenn $NAME gleich 'Steve' UND $Alter gleich 15."
fi
if [ $Name == "Daniya" ] || [ $Name == "Zach" ]
then
echo "Wird ausgeführt wenn $NAME gleich 'Daniya' ODER $NAME gleich 'Zach'."
fi
# Ausdrücke haben folgendes Format:
echo $(( 10 + 5 )) echo $(( 10 + 5 ))
# Anders als andere Programmiersprachen ist Bash eine Shell es arbeitet also im Kontext von Verzeichnissen. # Anders als andere Programmiersprachen ist Bash eine Shell es arbeitet also im Kontext von Verzeichnissen.
@ -69,13 +117,60 @@ ls -l # Liste alle Dateien und Unterverzeichnisse auf einer eigenen Zeile auf
# txt-Dateien im aktuellen Verzeichnis auflisten: # txt-Dateien im aktuellen Verzeichnis auflisten:
ls -l | grep "\.txt" ls -l | grep "\.txt"
# Befehle können innerhalb anderer Befehle mit $( ) erstetzt werden: # Ein- und Ausgabe können umgeleitet werden (stdin, stdout, and stderr).
# Von stdin lesen bis "EOF" allein in einer Zeile auftaucht
# und die Datei hello.py mit den Zeilen zwischen den beiden "EOF"
# überschreiben:
cat > hello.py << EOF
#!/usr/bin/env python
from __future__ import print_function
import sys
print("#stdout", file=sys.stdout)
print("#stderr", file=sys.stderr)
for line in sys.stdin:
print(line, file=sys.stdout)
EOF
# Führe hello.py mit verschiedenen Umleitungen von
# stdin, stdout und stderr aus:
python hello.py < "input.in"
python hello.py > "output.out"
python hello.py 2> "error.err"
python hello.py > "output-and-error.log" 2>&1
python hello.py > /dev/null 2>&1
# Die Fehlerausgabe würde die Datei "error.err" überschreiben (falls sie existiert)
# verwende ">>" um stattdessen anzuhängen:
python hello.py >> "output.out" 2>> "error.err"
# Überschreibe output.out, hänge an error.err an und zähle die Zeilen beider Dateien:
info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err
wc -l output.out error.err
# Führe einen Befehl aus und gib dessen "file descriptor" (zB /dev/fd/123) aus
# siehe: man fd
echo <(echo "#helloworld")
# Mehrere Arten, um output.out mit "#helloworld" zu überschreiben:
cat > output.out <(echo "#helloworld")
echo "#helloworld" > output.out
echo "#helloworld" | cat > output.out
echo "#helloworld" | tee output.out >/dev/null
# Löschen der Hilfsdateien von oberhalb, mit Anzeige der Dateinamen
# (mit '-i' für "interactive" erfolgt für jede Date eine Rückfrage)
rm -v output.out error.err output-and-error.log
# Die Ausgabe von Befehlen kann mit Hilfe von $( ) in anderen Befehlen verwendet weden:
# Der folgende Befehl zeigt die Anzahl aller Dateien und Unterverzeichnisse # Der folgende Befehl zeigt die Anzahl aller Dateien und Unterverzeichnisse
# im aktuellen Verzeichnis an. # im aktuellen Verzeichnis an.
echo "Dieser Ordner beinhaltet $(ls | wc -l) Dateien und Verzeichnisse." echo "Dieser Ordner beinhaltet $(ls | wc -l) Dateien und Verzeichnisse."
# Dasselbe kann man mit "backticks" `` erreichen, aber diese können
# nicht verschachtelt werden. $() ist die empfohlene Methode.
echo "Dieser Ordner beinhaltet `ls | wc -l` Dateien und Verzeichnisse."
# Bash nutzt einen case-Ausdruck, der sich ähnlich wie switch in Java oder C++ verhält. # Bash nutzt einen case-Ausdruck, der sich ähnlich wie switch in Java oder C++ verhält.
case "$VARIABLE" case "$Variable"
in in
# Liste der Fälle, die unterschieden werden sollen # Liste der Fälle, die unterschieden werden sollen
0) echo "Hier ist eine Null." 0) echo "Hier ist eine Null."
@ -83,10 +178,106 @@ in
*) echo "Das ist nicht Null." *) echo "Das ist nicht Null."
esac esac
# loops iterieren über die angegebene Zahl von Argumenten: # 'for' Schleifen iterieren über die angegebene Zahl von Argumenten:
# Der Inhalt von $VARIABLE wird dreimal ausgedruckt. # Der Inhalt von $Variable wird dreimal ausgedruckt.
for $VARIABLE in x y z for $Variable in {1..3}
do do
echo "$VARIABLE" echo "$Variable"
done done
# Oder verwende die "traditionelle 'for'-Schleife":
for ((a=1; a <= 3; a++))
do
echo $a
done
# Schleifen können auch mit Dateien arbeiten:
# 'cat' zeigt zuerst file1 an und dann file2
for Variable in file1 file2
do
cat "$Variable"
done
# .. oder mit der Ausgabe eines Befehls:
# Ausgabe des Inhalts jeder Datei, die von 'ls' aufgezählt wird
for Output in $(ls)
do
cat "$Output"
done
# while Schleife:
while [ true ]
do
echo "Schleifenkörper..."
break
done
# Funktionen definieren
# Definition:
function foo ()
{
echo "Argumente funktionieren wie bei skripts: $@"
echo Und: $1 $2..."
echo "Dies ist eine Funktion"
return 0
}
# oder einfacher
bar ()
{
echo "Auch so kann man Funktionen deklarieren!"
return 0
}
# Aufruf der Funktion:
foo "My name is" $Name
# Was du noch lernen könntest:
# Ausgabe der letzten 10 Zeilen von file.txt
tail -n 10 file.txt
# Ausgabe der ersten 10 Zeilen von file.txt
head -n 10 file.txt
# sortierte Ausgabe von file.txt
sort file.txt
# Mehrfachzeilen in sortierten Dateien unterdrücken
# oder (mit -d) nur diese ausgeben
uniq -d file.txt
# Ausgabe nur der ersten Spalte (vor dem ersten ',')
cut -d ',' -f 1 file.txt
# ersetze in file.txt jedes vorkommende 'gut' durch 'super' (versteht regex)
sed -i 's/gut/super/g' file.txt
# Ausgabe nach stdout aller Zeilen von file.txt, die auf eine regex passen
# Im Beispiel: Zeilen, die mit "foo" beginnen und mit "bar" enden
grep "^foo.*bar$" file.txt
# Mit der Option "-c" wird stattdessen die Anzahl der gefundenen Zeilen ausgegeben
grep -c "^foo.*bar$" file.txt
# verwende 'fgrep' oder 'grep -F' wenn du buchstäblich nach den Zeichen
# suchen willst, ohne sie als regex zu interpretieren
fgrep "^foo.*bar$" file.txt
# Dokumentation über die in bash eingebauten Befehle
# bekommst du mit dem eingebauten Befehl 'help'
help
help help
help for
help return
help source
help .
# Das bash-Handbuch liest du mit 'man'
apropos bash
man 1 bash
man bash
# Dann gibt es noch das 'info' System (drücke ? um Hilfe angezeigt zu bekommen)
apropos info | grep '^info.*('
man info
info info
info 5 info
# info Dokumentation über bash:
info bash
info bash 'Bash Features'
info bash 6
info --apropos bash
``` ```

View File

@ -18,12 +18,12 @@ Anmerkung des Übersetzers: Einige englische Begriffe wie *Repository*, *Commit*
### Was ist Versionsverwaltung? ### Was ist Versionsverwaltung?
Eine Versionskontrolle erfasst die Änderungen einer Datei oder eines Verzeichnisses im Verlauf der Zeit. Eine Versionsverwaltung erfasst die Änderungen einer Datei oder eines Verzeichnisses im Verlauf der Zeit.
### Zentrale im Vergleich mit verteilter Versionverwaltung ### Zentrale im Vergleich mit verteilter Versionverwaltung
* Zentrale Versionskontrolle konzentriert sich auf das Synchronisieren, Verfolgen und Sichern von Dateien. * Zentrale Versionsverwaltung konzentriert sich auf das Synchronisieren, Verfolgen und Sichern von Dateien.
* Verteilte Versionskontrolle konzentriert sich auf das Teilen der Änderungen. Jede Änderung hat eine eindeutige ID. * Verteilte Versionsverwaltung konzentriert sich auf das Teilen der Änderungen. Jede Änderung hat eine eindeutige ID.
* Verteilte Systeme haben keine vorbestimmte Struktur. Ein SVN-ähnliches, zentrales System wäre mit Git ebenso umsetzbar. * Verteilte Systeme haben keine vorbestimmte Struktur. Ein SVN-ähnliches, zentrales System wäre mit Git ebenso umsetzbar.
[Weiterführende Informationen](http://git-scm.com/book/en/Getting-Started-About-Version-Control) [Weiterführende Informationen](http://git-scm.com/book/en/Getting-Started-About-Version-Control)
@ -61,7 +61,7 @@ Der Index ist die die Staging-Area von Git. Es ist im Grunde eine Ebene, die Arb
### Commit ### Commit
Ein Commit ist ein Schnappschuss von Uderungen in deinem Arbeitsverzeichnis. Wenn du zum Beispiel 5 Dateien hinzugefügt und 2 andere entfernt hast, werden diese Änderungen im Commit (Schnappschuss) enthalten sein. Dieser Commit kann dann in andere Repositorys gepusht werden. Oder nicht! Ein Commit ist ein Schnappschuss von Änderungen in deinem Arbeitsverzeichnis. Wenn du zum Beispiel 5 Dateien hinzugefügt und 2 andere entfernt hast, werden diese Änderungen im Commit (Schnappschuss) enthalten sein. Dieser Commit kann dann in andere Repositories gepusht werden. Oder nicht!
### Branch ### Branch
@ -69,7 +69,9 @@ Ein Branch, ein Ast oder Zweig, ist im Kern ein Pointer auf den letzten Commit,
### HEAD und head (Teil des .git-Verzeichnisses) ### HEAD und head (Teil des .git-Verzeichnisses)
HEAD ist ein Pointer auf den aktuellen Branch. Ein Repository hat nur einen *aktiven* HEAD. Ein head ist ein Pointer, der auf ein beliebige Zahl von heads zeigt. HEAD ist ein Pointer auf den aktuellen Branch. Ein Repository hat nur einen *aktiven* HEAD.
Ein *head* ist ein Pointer, der auf einen beliebigen Commit zeigt. Ein Repository kann eine beliebige Zahl von *heads* enthalten.
### Konzeptionelle Hintergründe ### Konzeptionelle Hintergründe
@ -127,7 +129,7 @@ Zeigt die Unterschiede zwischen Index (im Grunde dein Arbeitsverzeichnis/-reposi
```bash ```bash
# Zeigt den Branch, nicht-verfolgte Dateien, Uderungen und andere Unterschiede an # Zeigt den Branch, nicht-verfolgte Dateien, Änderungen und andere Unterschiede an
$ git status $ git status
# Anderes Wissenswertes über git status anzeigen # Anderes Wissenswertes über git status anzeigen
@ -151,7 +153,7 @@ $ git add ./*.java
### branch ### branch
Verwalte alle Branches. Du kannst sie mit diesem Befehl ansehen, bearbeiten, neue erschaffen oder löschen. Verwalte alle Branches. Du kannst sie mit diesem Befehl ansehen, bearbeiten, neue erzeugen oder löschen.
```bash ```bash
# Liste alle bestehenden Branches und Remotes auf # Liste alle bestehenden Branches und Remotes auf
@ -186,7 +188,7 @@ $ git checkout -b newBranch
### clone ### clone
Ein bestehendes Repository in ein neues Verzeichnis klonen oder kopieren. Es fügt außerdem für hedes geklonte Repo remote-tracking Branches hinzu. Du kannst auf diese Remote-Branches pushen. Ein bestehendes Repository in ein neues Verzeichnis klonen oder kopieren. Es fügt außerdem für jedes geklonte Repository remote-tracking Branches hinzu. Du kannst auf diese Remote-Branches pushen.
```bash ```bash
# Klone learnxinyminutes-docs # Klone learnxinyminutes-docs
@ -288,16 +290,16 @@ $ git mv -f myFile existingFile
### pull ### pull
Führe einen Pull, zieht alle Daten, eines Repositorys und f?? einen Merge mit einem anderen Branch durch. Führe einen Pull (zieht alle Daten eines Repositories) aus und führt einen Merge mit einem anderen Branch durch.
```bash ```bash
# Update deines lokalen Repos, indem ein Merge der neuen Uderungen # Update deines lokalen Repos, indem ein Merge der neuen Änderungen
# von den remote-liegenden "origin"- und "master"-Branches durchgef?? wird. # von den remote-liegenden "origin"- und "master"-Branches durchgeführt wird.
# git pull <remote> <branch> # git pull <remote> <branch>
# git pull => impliziter Verweis auf origin und master # git pull => impliziter Verweis auf origin und master
$ git pull origin master $ git pull origin master
# F?? einen Merge von Uderungen eines remote-Branch und ein Rebase # Führt einen Merge von Änderungen eines remote-Branch und ein Rebase
# des Branch-Commits im lokalen Repo durch. Wie: pull <remote> <branch>, git rebase <branch>" # des Branch-Commits im lokalen Repo durch. Wie: pull <remote> <branch>, git rebase <branch>"
$ git pull origin master --rebase $ git pull origin master --rebase
``` ```
@ -337,8 +339,8 @@ $ git reset
# Setze die Staging-Area zurück, um dem letzten Commit zu entsprechen und überschreibe das Arbeitsverzeichnis # Setze die Staging-Area zurück, um dem letzten Commit zu entsprechen und überschreibe das Arbeitsverzeichnis
$ git reset --hard $ git reset --hard
# Bewegt die Spitze des Branches zu dem angegebenen Commit (das Verzeichnis bleibt unber??) # Bewegt die Spitze des Branches zu dem angegebenen Commit (das Verzeichnis bleibt unberührt)
# Alle Uderungen bleiben im Verzeichnis erhalten # Alle Änderungen bleiben im Verzeichnis erhalten
$ git reset 31f2bb1 $ git reset 31f2bb1
# Bewegt die Spitze des Branches zurück zu dem angegebenen Commit # Bewegt die Spitze des Branches zurück zu dem angegebenen Commit