updated:  2024 10. July
published:  2021 30. September

The Bourne-Again Shell

Sammelsurium zur Linux Bash.

Kommandos

xargs - Dateien löschen die sich in einer Liste befinden

xargs rm -v < liste.txt
   
columne - Listen spaltenweise ausgeben

 cat /etc/passwd  | column -t -s ":"
   

Shellvariable PS

Für die Ausgabe von Informationen auf der Konsole (Shell) stehen die Shellvariable PS0 bis PS4 zur Verfügung. Für einen Test kann die Variable PS1 einfach in einer Shell definiert werden, z.B.:


 PS1='\s \v \W \h \$> '
 PS1='${debian_chroot:+($debian_chroot)}\u@\h: \w \$: '
 
 # Bei doppelten Anführungszeichen muss maskiert werden
 PS1="${debian_chroot:+($debian_chroot)}\\u@\\h \\w \\$ "
 
 # Festlegung der Variable in der Datei ~/.bashrc
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;94m\]\u\[\033[01;92m\]@\[\033[01;33m\]\h\[\033[01;93m\]: \w\[\033[m\] \$ '
 # oder mit Escapecharakter \e statt \033 für die Farbe
 PS1='${debian_chroot:+($debian_chroot)}\[\e[01;94m\]\u\[\e[01;92m\]@\[\e[01;33m\]\h\[\e[01;93m\]: \w\[\e[m \$ '

 # Ausgabe PS1 bis PS4
 echo $PS0
 echo $PS1
 echo $PS2
 echo $PS3
 echo $PS4
 

Die Shellvariable PS1 kann folgende Informationen ausgeben.

Löschen in Strings

Lösche Zeichenkette rechts

 declare APPL=Helmert-Version-2019.exe
 declare SIGN=.exe

 echo ${APPL%.exe}	# Version 1 Ausgabe:  Helmert-Version-2019
 echo ${APPL%.*}	# Version 2 Ausgabe:  Helmert-Version-2019
 echo ${APPL%$SIGN}	# Version 3 Ausgabe:  Helmert-Version-2019
 echo ${APPL%Version*}  # Version 4 Ausgabe:  Helmert-
   

 declare APPL=Helmert-Version-2019.exe

 echo ${APPL#Helmert}	# Version 1 Ausgabe:  -Version-2019
 echo ${APPL#*mert}	# Version 2 Ausgabe:  -Version-2019
   
Dateiname splitten/teilen

 declare APPL=Datei.Name.001.exe

 declare Extension=${APPL##*.}	
 declare FileName=${APPL%.*}	

 echo $Extension	# Ausgabe: exe
 echo $FileName		# Ausgabe: Datei.Name.001

 # ... und mit zufälliger Zeichenfolge versehen
 declare file1=$(mktemp $FileName.out.XXX.$Extension)	# Version 1
 declare file2=$(mktemp ${APPL%.*}.out.XXX.${APPL##*.})	# Version 2

 echo $file1; rm $file1
 echo $file2; rm $file2
   

Suchen und ersetzen in Strings

Suche und ersetze erstes Vorkommen einer Zeichenkette

 declare textstring="I am Karl and Karl"
 declare replacetxt="Gustav" 

 echo ${textstring/Karl/$replacetxt}

 # Ausgabe:  
 # I am Gustav and Karl


Suche und ersetze alle Vorkommen einer Zeichenkette

 declare textstring="I am Karl and Karl"
 declare replacetxt="Gustav" 

 echo ${textstring//Karl/$replacetxt}

 # Ausgabe:  
 # I am Gustav and Gustav


Suche und ersetze letztes Vorkommen einer Zeichenkette

 declare textstring="I am Karl and Karl"
 declare replacetxt="Gustav" 

 echo ${textstring/%Karl/$replacetxt}

 # Ausgabe:  
 # I am Karl and Gustav


Mehrdimensionale Array in Bashscript verwenden

Ein Array kann als indiziertes Array (declare -a) oder als assoziatives Array (declare -A) erzeugt werden. Ein assoziatives Array beinhaltet ein Wertepaar mit einer Zeichenkette als Schlüssel und einem Wert. Der Wert wird mit dem Schlüssel angesprochen. Der Zugriff auf Arrayelemente eines indizierten Array erfolgt mit einem Index (fortlaufende Nummer).

Im Beispiel wird ein indiziertes Array mit zwei Zeilen und drei Spalten erzeugt. Folgende Regeln sind zu beachten. Eine Zeilen wird in Anführungszeichen deklariert und mit einem Backslash beendet. Als Spaltentrennzeichen wird das Leerzeichen verwendet. Das Array kann mit weiteren Zeilen ergänzt werden. Es ist auch Möglich eine unterschiedliche Spaltenanzahl zu verwenden.

1. indiziertes Array deklarieren und initialisieren

 declare -a array=()
 array=( \
 "C:\\Path\\to\\Programm      Programmfile.exe       Zelle13" \
 "Zelle21 Zelle22 Zelle23" \
 )
 

In einer FOR-Schleife wird jede Zeile aufgerufen und der Inhalt als komplette Zeile oder spaltenweise ausgegeben.

2. Zugriff und Ausgabe

 for ((i=0; i<${#array[@]}; i++)); do
	# read row i and save
        IFS=' ' read -r -a row <<< "${array[$i]}"
        colcount=${#row[@]};

	# Ausgabe Zeilenweise
        echo -e "ArrayIndex = $i \t Spaltenanzahl = $colcount \t Inhalt = ${row[@]} \n";

	# Ausgabe Spaltenweise
        for ((c=0; c<${#row[@]}; c++)); do
                echo -e "\t\t\t\t\t Spalte $c = ${row[$c]}";
        done
        echo -e "\n"
 done


Der Zugriff auf ein inidiziertes Array.

3. Zugriff auf Einzelinhalt

 IFS=' ' read -r -a tmp <<< "${array[1]}"
 echo ${tmp[0]}
 echo ${tmp[1]}
 echo ${tmp[2]}


Stichworte (tags)