
cli.help – Update: Bash Builtins Teil 4/5
10 weitere Tools für die Terminal-Hilfe, unter anderem printf und das clevere shift.
Unsere hauseigene Linux-Hilfe für den Terminal, cli.help, wird weiter gefüttert: Zehn weitere Bash-eigene Funktionen, darunter das omnipräsente printf und die praktische Array-Hilfe mapfile, könnt Ihr ab sofort nachschlagen. Damit sind es bereits 45 Bash Builtins, die sich zu den etwa 100 weiteren Hilfeseiten gesellen.
cli.help
Zur Erinnerung: cli.help liefert Euch die Hilfe zu Terminal-Befehlen direkt im Terminal, abzufragen via curl - etwa:
curl cli.help/hilfe
curl cli.help/tools
 Und wenn Ihr einfach mal alles durchsuchen wollt:
curl cli.help/alles | grep irgendwas
 Bei diesem vierten Update zu den Bash-internen Funktionen sind ein paar Dinge bei, die Ihr definitiv kennen solltet: printf wird ständig benötigt, um Ausgaben ordentlich formatieren zu können - so eine Art superkomplexer Bruder vom echo-Befehl. Mit mapfile lassen sich ziemlich fix Arrays erstellen, shift ist ein netter kleiner Helfer zum Abarbeiten von Argumenten von Skripten und über die beiden Konfigurationswerkzeuge shopt und set könnt Ihr Dutzende Optionen für die Bash setzen. Natürlich bekommt Ihr alle Dateien wieder wie folgt zu Gesicht:
curl cli.help/shopt
curl cli.help/printf
 Und so weiter und so fort ... Weitere Infos findet Ihr auch auf der GitHub-Seite von cli.help.
Inhalte
Und der Form halber, hier noch die hier völlig fehlplatzierten Inhalte - cli.help-Content gehört in den Terminal 😉
declare
Variable meine_var anlegen und mit dem Wert 11 belegen - identische Varianten:
declare meine_var=11
declare meine_var="11"
declare -- meine_var=11
meine_var=11
 Variable mit Nur-Lesen-Attribut anlegen:
declare -r meine_var="Hallo Welt"
 Variable als Integer (-i) deklarieren und Berechnung durchführen (Ausgabe wird 4, ohne -i wäre es der String "2+2"):
declare -i meine_var="2+2"
 Integer-Deklaration aus obigem Beispiel entfernen:
declare +i meine_var
 Assoziatives Array cities mit Großstädten als Schlüsseln und Ländern als Werten anlegen; anschließend das Land, das zur Stadt Berlin gehört ausgeben:
declare -A cities ( [berlin]=brd [hamburg]=brd [paris]=fra )
echo ${cities[berlin]}
 Obiges Array: Alle Schlüssel ausgeben, alle Werte ausgeben, ganzes Array ausgeben, in der Form "berlin : brd":
for i in "${!cities[@]}"; do echo $i; done
for i in "${cities[@]}"; do echo $i; done
for i in "${!cities[@]}"; do echo $i : ${cities[$i]}; done
 Schlüssel berlin aus obigem Beispiel löschen:
unset cities[berlin]
 Indexiertes Array mit Wochentagen anlegen, dann Arbeitstage ausgeben:
declare  tage=( [1]=Montag [2]=Dienstag [3]=Mittwoch [4]=Donnerstag [5]=Freitag [6]=Samstag [7]=Sonntag )
for i in {1..5}; do echo ${tage[$i]}; done
 mapfile
Array MAPFILE aus kommaseparierter (-d,) Liste erstellen und Delimiter (Kommas) entfernen (-t):
 mapfile  -d, -t < <(echo "eins,zwei,drei")
 Array MAPFILE komplett ausgeben
 echo "${MAPFILE[@]}"
 Array MAPFILE an Stelle 1 (zwei) ausgeben:
echo "${MAPFILE[1]}"
 Array MAPFILE aus Zeilen erstellen und Delimiter (Umbrüche) entfernen:
mapfile  < <(echo -e "eins\nzwei\ndrei\n")
 Array komplett ausgeben, als String (%s) plus Zeilenumbruch (\n):
printf "%s\n" "${MAPFILE[@]}"
 printf
"Hallo Welt" in Variable foobar schreiben:
printf -v foobar "Hallo Welt"
 Hallo und Welt in je einer Zeile ausgeben:
printf "Hallo\nWelt"
 Argument 1 ("Hallo" - Anführungszeichen mit \") und Argument 2 (Welt - ohne Anführungszeichen!) als Strings (%s) ausgeben:
printf "\n"%s\" %s" "Hallo" "Welt"
 Argumente und Text in Conversion String UND Argumenten mischen:
printf "Jetzt kommt Arg1 %s und jetzt Arg2 %s" blablabla "Arg1-Text" blablabla "Arg2-Text" bla ;)
 Von Argument 1 nur die ersten drei Zeichen ausgeben (%.3s), Argument 2 mit Leerzeichen auf insgesamt 10 Zeichen auffüllen (%-10s):
printf "\"%.3s\" \"%-10s\"" "Hallo" "Welt"
 Argument (9) als Fließkommazahl mit 5 Nachkommastellen ausgeben:
printf "Fließkommazahl: %.5f" 9
 Argument (9) als Fließkommazahl mit 5 Nachkommastellen ausgeben:
printf "Fließkommazahl: %.*f" 5 9
 Folgendes ausgeben: "Hallo UMBRUCH Welt TAB wie gehtss BACKSPACE heute?" (Das BACKSPACE löscht das zweite s bei gehtss.)
 printf "Hallo\nWelt\twie gehtss\b heute?"
Ausgabe:
 Hallo
 Welt    wie gehts heute?
 pwd
Aktuelles Verzeichnis ausgeben:
pwd 
 Aktuelles Verzeichnis ausgeben:
echo $PWD
 read
Text foobar in Variable REPLY einlesen:
read ENTER foobar ENTER
 Text foobar in Variable meintext einlesen:
read meintext ENTER foobar ENTER
 Text (Zeile) interaktiv eingeben lassen:
read -e meintext
 Interaktiv, mit vorgegebenem Text (-i):
read -e -i "Ein foobar-Text" meintext
 Interaktiv 5 Zeichen einlesen:
read -e -n5 meintext
 Interaktiv bis zum Delimiter ! einlesen:
read -e -d! meintext
 (Skript-)Nutzer interaktiv Text eingeben lassen, dabei Prompt anzeigen (-p), keine \ erlauben (-r), nach 10 Sekunden abbrechen (-t):
read -e -r -t10 meintext
 Mal praktisch 😉
read -e -r -t5 -p"Wieviel ist 2+1?" -d3 meintext && echo "Korrekt, 3!"
 Wörter in ein Array einlesen und ausgeben:
echo "foobar quatschtkopp banane" | while read -a meinarray; do echo -e "${meinarray[1]}"; done
 readarray
Synonym für mapfile:
curl cli.help/mapfile
 readonly
Nur lesbare Variable mit Scope "global" deklarieren:
readonly meine_var="Hallo Welt"
 Nur lesbare (r) Variable mit Scope "global" (g) deklarieren:
declare -gr meine_var="Hallo Welt"
 return
Shell-Funktion meintest verlassen und Exit Code beziehungsweise Return Value von 4 ausgeben:
function meintest() { echo Hallo Welt; return 4; }
 set
Optionen samt Stati anzeigen:
set -o
 Option verbose einschalten 1:
set -o verbose
 Option verbose einschalten 2:
set -v
 Option verbose ausschalten 1:
set +o verbose
 Option verbose ausschalten 2:
set +v
 shift
Beispielskript: Gibt Argument 1 als $1 - und shift macht dann Argument 2 zu $1 (Argument 1 wird verworfen). shift verwirft immer das erste Argument, alle anderen rücken nach, so dass jedes Argument nacheinander als $1 angesprochen werden kann:
Skript:
 while (( "$#" )); do
 echo Argument ist: $1
 shift
 done
 Aufruf:
 ./beispielskript.sh eins zwei drei
 Ausgabe:
 Argument ist: eins
 Argument ist: zwei
 Argument ist: drei
 Beispielskript 2: Wie eben, aber es wird Argument 1 ausgegeben - und shift verwirft dann dieses und das nächste - Ausgabe ist daher:
Skript:
 while (( "$#" )); do
 echo Argument ist: $1
 shift
 shift
 done
 Aufruf:
 ./beispielskript.sh eins zwei drei vier fünf
 Ausgabe:
 Argument ist: eins
 Argument ist: drei
 Argument ist: fünf
 shift die ersten 5 Argumente verwerfen lassen. Vorsicht: Die Anzahl aller Argumente muss ein Vielfaches des hier angegebenen shift-Werts sein - sonst läuft $# nie leer und das letzte Argument wird endlos ausgegeben.
Skript:
 while (( "$#" )); do
 echo Argument ist: $1
 shift 5
 done
 Aufruf 1:
 ./beispielskript.sh 1 2 3 4 5 6 7 8 9 10
 Ausgabe:
 Argument ist: 1
 Argument ist: 6
 Aufruf 2:
 ./beispielskript.sh 1 2 3 4 5 6 7 8 9 10 11
 Ausgabe:
 Argument ist: 1
 Argument ist: 6
 Argument ist: 11 --> Endlosschleife
 shopt
Alle (original Bash-)Optionen anzeigen:
shopt 
 Option autocd einschalten (set):
shopt -s autocd
 Option autocd ausschalten (unset):
shopt -u autocd
 source
Das Programm Xeyes ausführen (befindet sich im PATH):
source xeyes
 Bash-Nutzerkonfiguration neu laden:
source ~/.bashrc
 Alternativer und populärerer Aufruf:
. xeyes
 Weitere Artikel rund um den Terminal findet Ihr hier.
 
 




