Linux & Co.

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.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Do NOT follow this link or you will be banned from the site!