Es ist ein typisches Problem - ich möchte auf phpBB3 viele Bilder posten. Oder ich möchte wie jetzt eine Ansammlung an
Code: Alles auswählen
bash
Code: Alles auswählen
*.sh
Bilder werden in phpBB3 mit
Code: Alles auswählen
[img]bild.jpg[/img]
Code: Alles auswählen
\[code]...["/code]
Code: Alles auswählen
#!/bin/bash
rm *.txt
l=$(ls)
p=$(pwd)
for s in $l
do
l2=$(ls $s/*.sh)
for s2 in $l2
do
echo "[code]" >> "$s.txt"
cat "./$s2" >> "$s.txt"
echo $s2
echo "[/code"] >> "$s.txt"
done
done
viewtopic.php?t=85
Also, fangen wir an - Bash-Programmierung
Das erste was wir wissen müssen, ist wie wir ein Bash-Skript erstellen
- Bash-Skripte editieren - und das wichtigste
Als erstes müssen wir uns einen Editor suchen, möglich sind, neben vielen weiteren:-
Code: Alles auswählen
KDE: kate
-
Code: Alles auswählen
bash: nano
-
Code: Alles auswählen
bash: emacs
Hier schreiben wir Minimum reinCode: Alles auswählen
/home/user/hallo.sh
wir verlassen den Editor und starten das SkriptCode: Alles auswählen
#!/bin/bash echo "Hallo Welt"
Und erhalten die AusgabeCode: Alles auswählen
/bin/bash hallo.sh
Code: Alles auswählen
Hallo Welt
-
-
Code: Alles auswählen
echo
Dieser Befehl gibt hallo welt ausCode: Alles auswählen
cat
Dieser Befehl gibt uns den Inhalt der DateiCode: Alles auswählen
echo "Hallo Welt
ausCode: Alles auswählen
hallo.sh
Wir erhaltenCode: Alles auswählen
cat hallo.sh
Code: Alles auswählen
david@git:~$ cat hallo.sh #!/bin/bash echo "Hallo Welt" david@git:~$
kann dateien aneinandergehängt ausgebenCode: Alles auswählen
cat
Code: Alles auswählen
cat hallo1.sh hallo2.sh
- Zeichenketten
- Im Gegensatz zu anderen Programmiersprachen sind Zeichenketten kein eigener Datentyp
- Die Anführungsstriche maskieren
Code: Alles auswählen
" abd "
Code: Alles auswählen
abc
- Was passiert denn, wenn wir zwei Zeichenketten habenIn dem Falle wird trotzdem
Code: Alles auswählen
echo Hallo Welt
ausgegeben, weilCode: Alles auswählen
Hallo Welt
die Parameter nacheinander ausgibt, wieCode: Alles auswählen
echo
. aber, was ist, wenn wir an ein Bash-Skript den NamenCode: Alles auswählen
cat
ausgeben wollenCode: Alles auswählen
Max Mustermann
wird als zwei Zeichenketten interpretiertCode: Alles auswählen
Max Mustermann
undCode: Alles auswählen
Max
. Damit es als ganzes zu einem interpretiert wird muss man eingebenCode: Alles auswählen
Mustermann
. Leerzeichen sind bei der Bash immer der Beginn von etwas neuem. Wir werden das bei übergabeparameter an die Bash genauer kennen lernen.Code: Alles auswählen
"Max Mustermann"
- Umleitungen
- Um die Ausgabe eines Programms zum Beispiel
Code: Alles auswählen
> datei.txt
In eine DateiCode: Alles auswählen
echo "Hallo Welt"
, dass heisst sie werden nicht auf dem Terminal ausgeben, sondern landen in einer Datei - verwendet man das ZeichenUm zu leitenCode: Alles auswählen
>
. Dabei wird mit jedem Aufruf der für dieses Zeichen gilt, die Datei, in der die Ausgabe landet, überschrieben.grösserCode: Alles auswählen
echo "Hallo Welt" > datei1.txt cat "hallo.sh" > datei2.txt
- Damit die Datei nicht überschrieben wird, wie bei der vorherigen Umlenkung, sondern die neue Ausgabe angehängt wird, gibt es das Zeichen
Code: Alles auswählen
>> datei.txt
Code: Alles auswählen
>>
Hier wird die gemeinte Datei nicht überschrieben, sondern der Inhalt wird angehängtCode: Alles auswählen
echo "#Hallo Welt" >> hallo2.sh cat "hallo.sh" >> hallo2.sh
- Hier dient
Code: Alles auswählen
< input.txt
zur Umleitung, der StandardeingabeCode: Alles auswählen
<
. Anstatt, dass die Eingabe von der Tastatur kommt, kommt sie aus einer DateiCode: Alles auswählen
stdin
- Hier wird die Ausgabe von Programm
Code: Alles auswählen
prog1 | prog2
als Eingabe fürCode: Alles auswählen
prog1
verwendetCode: Alles auswählen
prog2
Code: Alles auswählen
cat "hallo" | dd
Code: Alles auswählen
david@git:~$ cat hallo.sh | dd #!/bin/bash echo "Hallo Welt" 0+1 Datensätze ein 0+1 Datensätze aus 33 Bytes kopiert, 2,0113e-05 s, 1,6 MB/s david@git:~$
- Einfache Variablen
- Definition
Um eine Variable zu definieren schreiben wirWollen wir erreichen, dassCode: Alles auswählen
s=Hallo s2="Hallo Welt" s3="Hallo"
wie oben beschrieben zugewiesen werden müssen wir Anführungsstriche verwenden. Wichtig ist - dass zwischen dem Gleichheitszeichen und dem Namen der Variablen und dem konstanten Wert, kein Leerzeichen besteht. Es geht nicht anders. Es geht nur so:Code: Alles auswählen
Hallo Welt
Was wir wissen müssen, ist, dass wir bei der Definition und Zuweisung eines Wertes keinCode: Alles auswählen
s=Hallo s2="Hallo Welt" s3="Hallo"
verwenden. Der Variablennamen steht alleine ohneCode: Alles auswählen
$
Haben wir diesen Schritt vollzogen, existieren die Variablen. Wir können auch integre Werte zuweienCode: Alles auswählen
$
Code: Alles auswählen
i=0 x=52
- Zugriff
Um auf eine Variable zu zu greifen, brauchen wir nun dasZeichen vor dem VariablennamenCode: Alles auswählen
$
Es macht keinen Unterschied ob dasCode: Alles auswählen
echo $s echo "$s" echo "$s2" echo "$s3" echo $i echo "$i" echo $x echo "$x"
und der Variablennamen nun zwischen Anführungszeichen stehen, sie werden immer als Variable interpretiert. Um dasCode: Alles auswählen
$
als eigenes Zeichen aus zu geben, müssen wir es maskieren.Code: Alles auswählen
$
Code: Alles auswählen
david@git:~$ echo \$Hallo $Hallo david@git:~$
- Definition
- Variablen als Argumente für das Bash-Skript
Wir schreiben folgendes Bash-Skript
Und rufen es aufCode: Alles auswählen
#!/bin/bash echo "$1" "$2" "$3"
Code: Alles auswählen
david@git:~$ /bin/bash test2.sh Hallo Welt sagt Hallo Welt sagt david@git:~$ /bin/bash test2.sh Hallo Welt sagt man Hallo Welt sagt david@git:~$
steht für den ersten Parameter an das Bash-Skript usw.Code: Alles auswählen
$1
- Arithmetische Ausdrücke und verweis auf auf Wir können mit der Bash ganz normal rechnen. Es gibt Mathematische Ausdrücke, wie:
Code: Alles auswählen
$()
Variablen müssen hier mitCode: Alles auswählen
4+2 (3+2)*4 ($i+1) ($x+2)*4
erscheinen. Es gibt auch ZuweisungenCode: Alles auswählen
$
So sehen wir schon, wir können inkrementieren, wie bei jeder ProgrammierspracheCode: Alles auswählen
y1=4+2 y2=(3+2)*4 y3=($i+1) y4=($x+2)*4 i=($i+1)
Es gibt eine besonderheit. Um der Bash mit zu teilen, dass es sich um einen arithmetischen Ausdruck handelt müssen wir ihn so stellenCode: Alles auswählen
i=($i+1) i=($i+1)
Wir dürfen uns durch dasCode: Alles auswählen
$((<arithmetischer Ausdruck>))$
Nicht beeindrucken lassen. Was seltsam aussieht, leitet den Ausdruck ein und beendet ihn. Alles, was wir an arithmetischen Ausdrücken schreiben, muss einfach da rein, ungeachtet alles anderen. DasCode: Alles auswählen
$(())$
hat nichts mit Variablen zu tun. Wir dürfen uns ebenso wenig dadurch beeindrucken lassen, dassCode: Alles auswählen
$
es jeweils 2 klammern sind. Das gehört einfach dazu. Es leitet arithmetische Ausdrücke ein. Es gibt die Version auch mit einer KlammerCode: Alles auswählen
(()))
Das bedeutet, der VariablenCode: Alles auswählen
l=$(ls)
oderCode: Alles auswählen
l
wir als Array die Ausgabe vonCode: Alles auswählen
$l
zugewiesen. Es handelt sich lediglich um SyntaxCode: Alles auswählen
ls
So können wir einen funktionierenden Code erstellen:
Jetzt sind wir irritiert. Warum steht:Code: Alles auswählen
i=0 echo $i i=$(($i+1)) echo $i i=$(($i+1)) echo $i
DasCode: Alles auswählen
i=0 i=$(($i+1)) i=$(($i+1))
ohneCode: Alles auswählen
i
dem wir den Wert zuweisen nicht mit inCode: Alles auswählen
$
. Wir müssen wissen, was der arithmetische Ausdruck selber ist:Code: Alles auswählen
$(())
Dieser hat einen Wert. Und der gehört inCode: Alles auswählen
$(($i+1))
. Der hat so oder so einen Wert. Da es keine Typen bei der Bash gibt, wird dieser Wert, wie bisher einer Variablen zugewiesen. Wie beiCode: Alles auswählen
$(())
Code: Alles auswählen
s="Hallo Welt" i=0
- Bedingungen und Verweis auf Pascal
Code: Alles auswählen
if then else
In Pascal gehen Bedingung soDies ist die typische Pascal-Syntax. In C schreibt manCode: Alles auswählen
IF <condition> THEN BEGIN END ELSE BEGIN END;
Code: Alles auswählen
if (Condition) { } else { }
undCode: Alles auswählen
{
undCode: Alles auswählen
BEGIN
undCode: Alles auswählen
}
sehen zwar unterschiedlich aus. Meinen aber das gleiche. Lexikalisch sind es Token. Die typische Pascalsyntax hat folgende FormCode: Alles auswählen
END
Es gibt allerdings eine abweichende Notation, was auch gleich ähnlich beiCode: Alles auswählen
IF <condition> THEN BEGIN END ELSE BEGIN END;
gilt:Code: Alles auswählen
WHILE
Code: Alles auswählen
IF condition THEN ELSE FI
leitet das Ende desCode: Alles auswählen
FI
ein. Bei dieser Syntax wird beiCode: Alles auswählen
IF THEN ELSE
die Schleife mitCode: Alles auswählen
WHILE DO
Eine Bedingung sieht bei der Bash richtig aus:Code: Alles auswählen
OD[/beendet]. Oder auch als Variante mit [code]DONE
Wichtig sind bei bei den Bedingungen:Code: Alles auswählen
#!/bin/bash if [ "$1" == "Max Mustermann" ] then echo "Hallo" elif [ "$1" == "Martin Mustermann" ] then echo "Tschüss" else echo "Super" fi
Die eckigen Klammern. Hierrin muss die Bedingung stehen und sie müssen einen Abstand zuCode: Alles auswählen
[ ... ]
und so weiter haben. Ein Vergleich von Strings geht mitCode: Alles auswählen
if
Code: Alles auswählen
==
- Schleifen und Verweis auf Pascal
Code: Alles auswählen
while do done
Worauf wir achten müssen ist, dass dasCode: Alles auswählen
while [ Bedingung ] do done
in der nächsten Zeile steht.Code: Alles auswählen
do
- Gleich, ungleich, grösser Gleich, Bedingungen, vergleich zu anderen Sprachen
Wir hatten es von arithmetischen Ausdrücken. In der Mathematik gibt es die Trichonometrie, das heisst, zwischen zwei Zahlen und ihrer Grössenrelation gilt entwederWir können das beim Programmieren erweiternCode: Alles auswählen
<, =, >
Und um das Nicht-GleichCode: Alles auswählen
<, <=, =, >, >=
Und rein theoretisch, bei intel ist das so, für alles das nicht einführenCode: Alles auswählen
<, <=, =, >, >=, !=
Wir haben alsoCode: Alles auswählen
<, <=, =, >, >=, !<, !<=, !=, !>, !>=
- Gleich
- Ungleich
- Kleiner
- Kleiner Gleich
- Grösser
- Grösser gleich
- Gleich
- Ungleich
- Kleiner
- Nicht kleiner
- Kleiner Gleich
- Nicht Kleiner Gleich
- Grösser
- Nicht Grösser
- Grösser gleich
- Nicht Grösser gleich
undCode: Alles auswählen
greater
als auchCode: Alles auswählen
above
undCode: Alles auswählen
less
Intel:Code: Alles auswählen
below
MIPS:Code: Alles auswählen
je jne jg, ja jng, jna jge, jae jnge, jnae jl, jb jnl, jnb jle, jbe jnle, jnbe
Bei der Bash sieht das so ausCode: Alles auswählen
beq, bne blt*, ble* bgt*, bge*
Diese können wir in der Bedingung für arithmetische Ausdrücke benutzenCode: Alles auswählen
- eq - ne - gt - ge - lt - le
Was sich hinter der Bedingung letzten Endes verbirgt, ist dasCode: Alles auswählen
WHILE [ $i -lt 10 ] DO ... DONE
Programm. Und jetzt können wir ein Programm schreiben, was zählt und hallo ausgibtCode: Alles auswählen
test
Code: Alles auswählen
i=0 while [ $i -lt 10 ] do echo "Hallo zum $(($i+1))." i=$(($i+1)) done
- Arrays
Arrays werden initialisiert mit
und erweitert mitCode: Alles auswählen
a=(Hallo super Sache)
AlsoCode: Alles auswählen
a+=(Hallo auch)
Um auf das Array zu zu greifen, geht es entweder mit derCode: Alles auswählen
a=(Hallo super Sache) a+=(Hallo auch)
Schleife, wie im nächsten Beispeil oder mit einem IndexCode: Alles auswählen
FOR
Das sieht jetzt etwas kompliziert aus. Aber wieCode: Alles auswählen
echo ${a[0]} echo ${a[1]} echo ${a[2]} echo ${a[3]}
einen arithmetischen Ausdruck umgibt, umgibtCode: Alles auswählen
$(())
ein einzelnes Element. Das muss es. Für das Element selbst. Zugegriffen wird auf die einzelnen Elemente, wie üblich über Indizes. Was wichtig ist: Innerhalb vonCode: Alles auswählen
${}
wird vor der Variable keinCode: Alles auswählen
${}
geschrieben. Um die Werte mit einem Variablen Index aus zu geben, muss man sich der etwas umständlich aussehenden Schreibweise bedienenCode: Alles auswählen
$
Ist es bei genauerem Hinsehen nicht. Um auf das Ganze Array zu zu greifen verwendet manCode: Alles auswählen
i=3 echo ${a[$i]}
Code: Alles auswählen
@
Code: Alles auswählen
echo "${a[@]}" [*] Schleifen [code] for ... in .. do
liefert die Ausgabe vonCode: Alles auswählen
l=$(ls)
als Array anCode: Alles auswählen
ls
. UmCode: Alles auswählen
l
einzeln aus zu geben, kann man verwenden:Code: Alles auswählen
l
Code: Alles auswählen
l=$(ls) for s in $l do echo "$s" done