EMZETT.
Login

Kurz: for f in “{fruechte[@]}"; do echo "- f”; done # Anführungszeichen wichtig!

Teil des Kurses Bash

Kapitel 6 von 13 im Kurs Bash. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Indizierte Arrays

fruechte=(Apfel Birne "rote Kirsche")
echo "${fruechte[0]} | ${fruechte[2]}"
echo "Anzahl: ${#fruechte[@]}"
fruechte+=(Dattel)                      # anhängen
fruechte[1]="Banane"                    # ändern
echo "Alle: ${fruechte[@]}"
echo "Indizes: ${!fruechte[@]}"
echo "Ab Index 1: ${fruechte[@]:1}"
echo "Zwei ab 1: ${fruechte[@]:1:2}"
unset 'fruechte[0]'
echo "Nach unset: ${fruechte[@]} (${#fruechte[@]})"
 
for f in "${fruechte[@]}"; do echo "- $f"; done      # Anführungszeichen wichtig!
 
zahlen=(5 3 9 1)
sortiert=($(printf "%s\n" "${zahlen[@]}" | sort -n))
echo "Sortiert: ${sortiert[*]}"

Ausgabe:

Apfel | rote Kirsche
Anzahl: 3
Alle: Apfel Banane rote Kirsche Dattel
Indizes: 0 1 2 3
Ab Index 1: Banane rote Kirsche Dattel
Zwei ab 1: Banane rote Kirsche
Nach unset: Banane rote Kirsche Dattel (3)
- Banane
- rote Kirsche
- Dattel
Sortiert: 1 3 5 9

Assoziative Arrays (Maps)

Ab Bash 4:

declare -A alter
alter[Mia]=17
alter[Tom]=25
alter["Zoe Müller"]=31
echo "Mia ist ${alter[Mia]}"
echo "Anzahl: ${#alter[@]}"
for name in "${!alter[@]}"; do :; done
for name in $(printf "%s\n" "${!alter[@]}" | sort); do
    echo "$name -> ${alter[$name]}"
done
[[ -v alter[Tom] ]] && echo "Tom vorhanden"
unset 'alter[Tom]'
[[ -v alter[Tom] ]] || echo "Tom gelöscht"
 
declare -A zaehler
for wort in a b a c a b; do ((zaehler[$wort]++)); done
for k in a b c; do echo "$k: ${zaehler[$k]}"; done

Ausgabe:

Mia ist 17
Anzahl: 3
Mia -> 17
Tom -> 25
Zoe ->
Müller ->
Tom vorhanden
Tom gelöscht
a: 3
b: 2
c: 1

String-Operationen ohne externe Programme

s="Hallo Welt, hallo Bash"
echo "Länge: ${#s}"
echo "Teil: ${s:0:5} | ab 6: ${s:6} | letzte 4: ${s: -4}"
echo "Ersetzen (erstes): ${s/hallo/Hi}"
echo "Ersetzen (alle):   ${s//l/L}"
echo "Großschrift: ${s^^}"
echo "Kleinschrift: ${s,,}"
echo "Erster Buchstabe groß: ${s^}"
 
pfad="/home/mia/bericht.final.txt"
echo "Datei:      ${pfad##*/}"           # längstes Präfix */ entfernen
echo "Ordner:     ${pfad%/*}"            # kürzestes Suffix /* entfernen
echo "Endung:     ${pfad##*.}"
echo "ohne Endung: ${pfad%.*}"
echo "Basisname:  $(basename "$pfad" .txt) | Ordner: $(dirname "$pfad")"
 
[[ $s == *Welt* ]] && echo "enthält Welt"
text="  getrimmt  "
text="${text#"${text%%[![:space:]]*}"}"
text="${text%"${text##*[![:space:]]}"}"
echo "[$text]"

Ausgabe:

Länge: 22
Teil: Hallo | ab 6: Welt, hallo Bash | letzte 4: Bash
Ersetzen (erstes): Hallo Welt, Hi Bash
Ersetzen (alle):   HaLLo WeLt, haLLo Bash
Großschrift: HALLO WELT, HALLO BASH
Kleinschrift: hallo welt, hallo bash
Erster Buchstabe groß: Hallo Welt, hallo Bash
Datei:      bericht.final.txt
Ordner:     /home/mia
Endung:     txt
ohne Endung: /home/mia/bericht.final
Basisname:  bericht.final | Ordner: /home/mia
enthält Welt
[getrimmt]
SyntaxWirkung
${s#muster} / ${s##muster}kürzestes / längstes Präfix entfernen
${s%muster} / ${s%%muster}kürzestes / längstes Suffix entfernen
${s/alt/neu} / ${s//alt/neu}erstes / alle ersetzen
${s^^} ${s,,}groß / klein
${s:start:länge}Teilstring
${#s}Länge

Zerlegen und Zusammenfügen

csv="Mia,17,Berlin"
IFS=, read -ra teile <<< "$csv"
echo "${teile[2]} (${#teile[@]} Teile)"
(IFS='|'; echo "${teile[*]}")           # verbinden mit anderem Trenner
echo "$(IFS=-; echo "${teile[*]}")"
 
wort="Bash"
for ((i = ${#wort} - 1; i >= 0; i--)); do printf "%s" "${wort:i:1}"; done; echo
printf '%s\n' "${wort}" | rev
printf "%05.1f|%-6s|%6s|%x|%o\n" 3.14159 ab cd 255 8

Ausgabe:

Berlin (3 Teile)
Mia|17|Berlin
Mia-17-Berlin
hsaB
hsaB
003.1|ab    |    cd|ff|10

Merke

  • Arrays: a=(x y), ${a[@]}, ${#a[@]}, "${a[@]}" zum Durchlaufen
  • Maps: declare -A m, ${m[key]}, ${!m[@]}
  • Strings: ${s:0:3}, ${s/a/b}, ${s^^}, ${s##*/}, ${s%.*}
  • IFS steuert das Zerlegen (read -ra)

Übungsaufgabe

Zähle mit einem assoziativen Array, wie oft jedes Wort in einem Satz vorkommt.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Funktionen und Argumente

Weiter: Pipes, Umleitungen und Prozesse

Alle Kapitel: Bash im Überblick