ubuntuusers.de

BASH: Liste abarbeiten, jede n-te Zeile melden

Status: Gelöst | Ubuntu-Version: Kubuntu 18.04 (Bionic Beaver)
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Hallo,

ich möchte bei der Abarbeitung einer Liste nach jeder n-ten Zeile (N = 2 oder 10 oder :..) eine Meldung ausgeben

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
N=10
Lauf=0
Init=0
for Zeile in $Liste; do
   Lauf=$((Lauf + 1))
   if [ "$Lauf" / N != Init ]; then    # SO klappt's nicht!
      Init = $((Init + 1))
      echo "... "$Init"0 Zeilen bearbeitet ..."
   fi
done

Wie komme ich zum Ziel? Danke, Michael

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

declare -a list=({1..100})

declare -i step=10
declare -i line_count=0
for line in "${list[@]}"
do
    if [ $(( ++line_count % step )) -eq 0 ]
    then
        echo "... $line_count Zeilen bearbeitet ..."
    fi
done

Das liefert dann

... 10 Zeilen bearbeitet ...
... 20 Zeilen bearbeitet ...
... 30 Zeilen bearbeitet ...
... 40 Zeilen bearbeitet ...
... 50 Zeilen bearbeitet ...
... 60 Zeilen bearbeitet ...
... 70 Zeilen bearbeitet ...
... 80 Zeilen bearbeitet ...
... 90 Zeilen bearbeitet ...
... 100 Zeilen bearbeitet ... 

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Danke seahawk1986,

wieder eine perfekte Lösung von Dir! Vielleicht magst Du mir die "magische" Zeile

if [ $(( ++line_count % step )) -eq 0 ]

noch erklären? Was bedeuten ++ und % oder wo finde ich dazu eine Anleitung.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

++, in diesem Fall vorangestellt das sogenannte prefix Inkrement, erhöht die Variable um eins und % ist der Rest bei ganzzahligem Teilen. Wenn % 0 ergibt, ist also die erste Zahl durch die zweite teilbar.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11267

Wohnort: München

Alles innerhalb von $(()) steckt in einer Arithmetic Expansion. Die Operatoren dafür sind in https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Arithmetic beschrieben. Das Ergebnis der Expansion ersetzt diese (mit (( )) würde das Ergebnis nicht ausgegeben).

Innerhalb dieser Umgebung kann man auf Variablen-Werte ohne extra $ zugreifen. ++ vor einer Variable inkrementiert sie vor weiteren Operationen, also wird durch ++line_count als erstes der Wert der Variable line_count um eins erhöht und der nachfolgende Operator ist für den Modulo, liefert also den Rest der Division durch step.

Das if-Konstrukt drum herum sollte klar sein, das schaut einfach, ob die Ausgabe der arithmetischen Expansion (also der Rest der Divison von line_count durch step) 0 ist.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 857

Danke! Ich muss noch viel lernen ...

Antworten |