Linux-Praxisbuch/ Shellprogrammierung/ Zeichenketten-Funktionen
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:
Von-Bis
[Bearbeiten]s1=vornvonbishinten; l1=${#s1}; echo ${s1:4:6},$l1 #mid vonbis,16
Rechts
[Bearbeiten]s1=vornvonbishinten; l1=${#s1}; echo ${s1:l1-6},$l1 #right hinten,16
Links
[Bearbeiten]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
Links von
[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]?
[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 ~#
printf
[Bearbeiten]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^
Flags
[Bearbeiten]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
- angepasst aus Quelle: Wikibooks C-Programmierung: Einfache Ein- und Ausgabe
- 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 }