Kurz: for f in “{fruechte[@]}"; do echo "- f”; done # Anführungszeichen wichtig!
Teil des Kurses Bash
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 9Assoziative 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]}"; doneAusgabe:
Mia ist 17
Anzahl: 3
Mia -> 17
Tom -> 25
Zoe ->
Müller ->
Tom vorhanden
Tom gelöscht
a: 3
b: 2
c: 1String-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]| Syntax | Wirkung |
|---|---|
${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 8Ausgabe:
Berlin (3 Teile)
Mia|17|Berlin
Mia-17-Berlin
hsaB
hsaB
003.1|ab | cd|ff|10Merke
- 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%.*} IFSsteuert das Zerlegen (read -ra)
Übungsaufgabe
Zähle mit einem assoziativen Array, wie oft jedes Wort in einem Satz vorkommt.
Quiz zur Selbstkontrolle
Wie durchläufst du ein Array sicher?
- for x in ”${arr[@]}” (richtig)
- for x in $arr
- for x in arr
- for x in ${arr}
Was entfernt ${datei%.*}?
- Die Dateiendung (richtig)
- Den Ordner
- Den ersten Buchstaben
- Alle Punkte
Womit deklariert man ein assoziatives Array?
- declare -A (richtig)
- declare -a
- map
- dict
Weiter im Kurs
Zurück: Funktionen und Argumente
Weiter: Pipes, Umleitungen und Prozesse
Alle Kapitel: Bash im Überblick