Linux-Praxisbuch/ Shellprogrammierung/ Zeichenketten-Funktionen

  1. Beispiele für Unix-Befehle
  2. Grundsätzliches
  3. Aufbau eines Shell-Skriptes

StandardfunktionenBearbeiten

In der Bash gibt es eine Reihe von einfach zu schreibenden, jedoch nicht leicht verständlichen Funktionen mit denen man Zeichenketten extrahieren kann:

Von-BisBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1:4:6},$l1 #mid
vonbis,16

RechtsBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1:l1-6},$l1 #right
hinten,16

LinksBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1::4},$l1 #left
vorn,16

Rechts vonBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1#vorn},$l1 #right from
vonbishinten,16

Links vonBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1%hinten},$l1 #left from
vornvonbis,16

ErsetzenBearbeiten

s1=vornvonbishinten; l1=${#s1}; echo ${s1/vonbis/},$l1 #subst
vornhinten,16

Aufteilen des langen DateinamensBearbeiten

fnlong=/test1/test/test.dat; fnkurz=${fnlong##*/};
fnsehrkurz=${fnkurz%.*}; fnext=${fnkurz#*.}; dname=${fnlong%/*} ; echo
$fnlong ; echo $dname; echo $fnkurz ; echo $fnsehrkurz; echo $fnext
/test1/test/test.dat	#long
/test1/test	#dname
test.dat	#kurz
test	#sehrkurz
dat	#extension

Anzeigen von VariablenBearbeiten

v1=1;v2=2;echo ${!v*}
v1 v2

Umwandlung in GroßbuchstabenBearbeiten

v1=gross; echo ${v1^^} 
GROSS
v1=gross; echo ${v1^}  # erster buchstabe
Gross

Umwandlung in KleinbuchstabenBearbeiten

v1=KLEIN; echo ${v1,}  # erster buchstabe
kLEIN
v1=KLEIN; echo ${v1,,} 
klein

Erhöhen,Verringern um ?Bearbeiten

?Bearbeiten

var=8;let var-=2;echo $var
6
var=8;let var+=5;echo $var
13

1, Inkrement, DekrementBearbeiten

i=1;let i++;echo $i
2
i=1;let i--;echo $i
0

Einzeilige If AbfrageBearbeiten

! Die nachgestellte If Abfrage erlaubt keinen Else-Zweig.

opt=0 ; [ $opt = 1 ] && echo "Option ist gesetzt"
opt=1 ; [ $opt = 1 ] && echo "Option ist gesetzt"
Option ist gesetzt

ZeilenfortsetzungBearbeiten

Der Backslash am Ende einer Zeile setzt diese auf der nächsten Zeile fort, so daß man eine umgebrochene Anzeige bei langen Zeilen im Editor erreicht. ! Beachte die Position des Backslash in der Eingabezeile ist für manchen Befehl ausschlaggebend, ob er als solcher erkannt wird

~# i=1;i=2;i=1;i=2;i=1;i=2;i=1;i=2;i=1;i=2;i=1;i=2;i=1;i=2;i=1;i=2;i=\
> 99;echo $i
99
~#

printfBearbeiten

Der Unix-Befehl printf dient zur formatierten Ausgabe auf der Standardausgabe.

usage: printf [-v var] format [arguments]
format: "%{-+ #0}B.NU" >B<reite, >N<achkomma, >U<mwandlung
-linksbuendig +fuehrend:vorzeichen " " fuehrend:leerzeichen 
# fuehrend:indikator, 0 fuehrend:null 
U:s string, c zeichen, i integer, f reelle zahl 

Beispiel:

printf "%08.3f" 22,44 #laenge 8,nachstellen 3,double, fuehrend mit 0
0022,440

Formatelemente von printfBearbeiten

printf kann auch mehrere Parameter verarbeiten, diese muessen dann durch Leerzeichen voneinander getrennt werden.

printf "%i plus %i ist gleich %s \n" 3 2 Fuenf
3 plus 2 ist gleich Fuenf

Die mit dem %-Zeichen eingeleiteten Formatelemente greifen nacheinander auf die durch Leerzeichen getrennten Parameter zu (das erste %i auf 3, das zweite %i auf 2 und %s auf den String Fuenf).

Man kann sich den Formatstring als eine Schablone vorstellen, die vorgibt, wie die restlichen Parameter ausgegeben werden sollen, Fuelltext kann zusaetlich eingefuegt werden.

Innerhalb von format werden Umwandlungszeichen (engl. conversion modifier) fuer die weiteren Parameter eingesetzt. Hierbei muss der richtige Typ verwendet werden.

Die wichtigsten Umwandlungszeichen sind:

Zeichen Umwandlung
%d oder %i int
%c einzelnes Zeichen
%e oder %E double in Exponentialschreibweise
%f double im Format [-]ddd.ddd
%o int als Oktalzahl ausgeben
%p die Adresse eines Pointers
%s Zeichenkette ausgeben
%u unsigned int, negative Werte werden in positive verwandelt
%x oder %X int als Hexadezimalzahl ausgeben
%% Prozentzeichen

Beispiele Formatumwandlung

printf "Integer: %d\n" 42
Integer: 42 
printf "Double: %.6f\n" 3,141
Double: 3,141000
printf "Zeichen: %c\n" z
Zeichen: z
printf "Zeichenkette: %s\n" abc
Zeichenkette: abc
printf "43 Dezimal ist in Oktal: %o\n" 43
43 Dezimal ist in Oktal: 53
printf "43 Dezimal ist in Hexadezimal: %x\n" 43
43 Dezimal ist in Hexadezimal: 2b
printf "Und zum Schluss geben wir noch das Prozentzeichen aus:%%\n" 
Und zum Schluss geben wir noch das Prozentzeichen aus:%

Neben dem Umwandlungszeichen kann eine Umwandlungsangabe weitere Elemente zur Formatierung erhalten. Dies sind maximal:

  • ein Flag
  • die Feldbreite
  • durch einen Punkt getrennt die Anzahl der Nachkommstellen (Laengenangabe)
  • und an letzter Stelle schließlich das Umwandlungszeichen selbst
format: "%{-+ #0}B.NU" >B<reite, >N<achkomma, >U<mwandlungszeichen
          ^Flags^

FlagsBearbeiten

Unmittelbar nach dem Prozentzeichen werden die Flags (dt. Kennzeichnung) angegeben. Sie haben die folgende Bedeutung:

  • - (Minus): Der Text wird links ausgerichtet.
  • + (Plus): Es wird auch bei einem positiven Wert ein Vorzeichen ausgegeben.
  • Leerzeichen: Ein Leerzeichen wird ausgegeben, wenn der Wert positiv ist.
  • #: Welche Wirkung das Kennzeichen # hat, ist abhaengig vom verwendeten Format: Wenn ein Wert ueber %x als Hexadezimal ausgegeben wird, so wird jedem Wert ein 0x vorangestellt (außer der Wert ist 0).
  • 0: Die Auffuellung erfolgt mit Nullen anstelle von Leerzeichen, wenn die Feldbreite veraendert wird.

Beispiele Flags

printf "Zahl 67: |%-5i|\n" 67 #linksbuendig
Zahl 67: |67   |
printf "Zahl 67: |% 5i|\n" 67 #rechtsbuendig
Zahl 67: |   67|
printf "Zahl -67: %+i\n" -67 #mit Vorzeichen
Zahl -67: -67
printf "Zahl 67: %+i\n" 67
Zahl 67: +67
printf "Zahl 67: % i\n" 67 #mit vorzeichenbezogenem Leerzeichen
Zahl 67:  67
printf "Zahl 67: %i\n" 67
Zahl 67: 67
printf "Zahl 67:%#x\n" 67 #mit hexindikator
Zahl 67:0x43
printf "Zahl 67:%x\n" 67
Zahl 67:43
printf "Zahl 67: %05i\n" 67 #mit vornullen
Zahl 67: 00067

FeldbreiteBearbeiten

Hinter dem Flag kann die Feldbreite (engl. field width) festgelegt werden. Das bedeutet, dass die Ausgabe mit der entsprechenden Anzahl von Zeichen aufgefuellt wird.

Beispiele Feldbreite

printf 'Zahlen rechtsbuendig ausgeben:\n %4d\n %4d\n %4d\n' 34 343 3343
Zahlen rechtsbuendig ausgeben:
   34
  343
 3343
printf 'Zahlen linksbuendig ausgeben:\n %-4d\n %-4d\n %-4d\n' 34 343 3343
Zahlen linksbuendig ausgeben:
 34  
 343 
 3343
printf 'Zahlen rechtsbuendig ausgeben:\n %05d\n %05d\n %05d\n' 34 343 3343
# mit vornullen, laenge 5
Zahlen rechtsbuendig ausgeben:
 00034
 00343
 03343
printf 'Zahlen rechtsbuendig ausgeben:\n %04d\n %04d\n %04d\n' 34 343 3343
#mit vornullen
Zahlen rechtsbuendig ausgeben: 
 0034 
 0343
 3343

Standardmaeßig erfolgt die Ausgabe rechtsbuendig. Durch Voranstellen des Minuszeichens kann die Ausgabe aber auch linksbuendig erfolgen.

Besitzt ein Argument weniger Zeichen, als Sie mit der minimalen Breite vorgegeben haben, so werden die restlichen Zeichen mit Leerzeichen / Fuellzeichen aufgefuellt.

NachkommastellenBearbeiten

Nach der Feldbreite folgt, durch einen Punkt getrennt, die Genauigkeit. Bei %f werden ansonsten standardmaeßig 6 Nachkommastellen ausgegeben. Diese Angaben sind natuerlich auch nur bei den Gleitkommatypen float und double sinnvoll, weil alle anderen Typen keine Nachkommastellen besitzen.

Beispiele Nachkommastellen

wert1=99,2432422; printf "Summe: %.3f\n" $wert1
Summe: 99,243

Formatierte Ausgabe in Variable ablegenBearbeiten

Man kann die so formatierten Ausgaben auch in eine Variable legen:

mitvornullen=$(printf '%04d' 34);echo "34 $mitvornullen"
34 0034

Wert und Formatierungsvorlage aus ArrayBearbeiten

Einfach kann mich sich die Ausgabe machen, wenn man ein zweidimensionales Feld einrichtet, in dem im Feld 0 die Formatierung liegt und im Feld 1 der Wert selbst (ggf. befuellen aus einer Datei).

array[1,0]="|%010s|\n";array[1,1]="12";printf ${array[1,0]} ${array[1,1]}
|        12| #zeile 1
array[2,0]="|%-10s|\n";array[2,1]="12";printf ${array[2,0]} ${array[2,1]}
|12        | #zeile 2
  1. angepasst aus Quelle: Wikibooks C-Programmierung: Einfache Ein- und Ausgabe
  2. Herzlichen Dank dem Autor

function: ecode, Auswertung RückgabewertBearbeiten

Farbige Anzeige aufgrund des Rückgabewertes des letzten Befehls.

function ecode ()
{ # parameter: $1 rueckgabewert, $2 eingabeaufforderung
fg_rot=$(tput setaf 1)
fg_gruen=$(tput setaf 2)
fg_gelb=$(tput setaf 3)
attr_end=$(tput sgr0)
case $1 in #$?
0 | "")	echo "${0##*/}:[${fg_gruen} OK! ${attr_end}]" ;;
1)	echo "${0##*/}:[${fg_rot} ERR ${attr_end}] ";; 
*)	echo "${0##*/}:[${fg_gelb} $1 ${attr_end}]";;
esac    
if [ $2 ]; then
echo [q] Fenster schliessen
DUMMY="q"
read -n1 DUMMY
fi
exit $1
}

function: einfache FortschrittsanzeigeBearbeiten

Im Uhrzeigersinn laufender Strich. ggf. mit sleep {sekunden} verlangsamen

function progress ()
{ # parameter: $1 0-9 zeichnen , sonst. leeren
case $1 in
0|4|8)	echo -n \|;;
1|5|9)	echo -n \/;;
2|6)	echo -n \-;;
3|7)	echo -n \\;;
*)    echo -ne "\b";;
esac    
}