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.