Linux-Praxisbuch/ Shellprogrammierung/ Zeichenketten-Funktionen

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

Standardfunktionen

Bearbeiten

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

s1=vornvonbishinten; l1=${#s1}; echo ${s1:4:6},$l1 #mid
vonbis,16
s1=vornvonbishinten; l1=${#s1}; echo ${s1:l1-6},$l1 #right
hinten,16
s1=vornvonbishinten; l1=${#s1}; echo ${s1::4},$l1 #left
vorn,16

Rechts von

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

Ersetzen

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

Aufteilen des langen Dateinamens

Bearbeiten
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 Variablen

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

Umwandlung in Großbuchstaben

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

Umwandlung in Kleinbuchstaben

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

Erhöhen,Verringern um ?

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

1, Inkrement, Dekrement

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

Einzeilige If Abfrage

Bearbeiten

! 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

Zeilenfortsetzung

Bearbeiten

Der Backslash am Ende einer Zeile setzt diese auf der nächsten Zeile fort, so dass man eine umgebrochene Anzeige bei langen Zeilen im Editor erreicht. ! Beachte: Die Position des Backslash in der Eingabezeile ist für manchen Befehl dafür 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
~#

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 printf

Bearbeiten

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 Format-Elemente 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 zusaetzlich 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^

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

Feldbreite

Bearbeiten

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.

Nachkommastellen

Bearbeiten

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 ablegen

Bearbeiten

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

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

Wert und Formatierungsvorlage aus Array

Bearbeiten

Einfach kann man 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ückgabewert

Bearbeiten

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 Fortschrittsanzeige

Bearbeiten

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    
}