Rolf Buenning <
r.bue...@gmx.de>:
> Nachdem meine Script nach etlichen Ăberarbeitungen nun "fertig"
> ist, möchte ich es euch mal zeigen.
>
> #!/bin/bash
> # Umbenennung eines falsch bezeichneten Kontoauszugs
>
> Name=Auszug.pdf
> NullStr=""
>
> A=$(grep --text Kontoauszug Auszug.pdf | awk '{print $3}')
> # A enthÀlt jetzt die Auszugnummer und das Jahr in der
> # Form Nummer/Jahr
> # trennen Nummer und Jahr
> Nummer=${A%/*}
> Jahr=${A#*/}
>
> # prĂŒfen, ob Nummer ein-, zwei- oder dreistellig ist, um
> # die Anzahl einzufĂŒgender Nullen festzulegen zu können.
> # vierstellig dĂŒrfte bei mir kaum vorkommen
>
> # Das 'Nummernfeld' in der Kontoauszugbezeichnung muss
> # letztendlich sechsstellig sein.
>
> if [ $Nummer -lt 10 ]
> #einstellig
> then
> NullStr="_00000"
> elif
> [ $Nummer -lt 100 ]
> # zweistellig
> then
> NullStr="_0000"
> else
> # dreistellig
> NullStr="_000"
> fi
Da hÀtte ich dir elegantere und robustere VorschlÀge, die nötige
Anzahl von fĂŒhrenden Nullen aufzufĂŒllen:
(1) Nutze die FÀhigkeit von «printf», Zahlen mit einer
Mindestanzahl von Ziffern auszugeben:Â Das ShellâKommando
Nummer="$( printf '%1.6d\n' "$Nummer" )"
liefert dir die Zahl mit einer Mindestanzahl von 6 Ziffern (mehr
Ziffern nur dann, wenn sie in 6 Ziffern nicht hineinpasst).
Wenn du lieber kein Programm (hier: «printf») aufrufen möchtest,
um den Rechenaufwand des ShellâSkripts möglichst klein zu
halten[1], kannst du auch mit Bordmitteln des Shells arbeiten:
[1] Heutige Shells (beispielsweise auch «bash») haben allerdings
«printf» meist eingebaut. Daher zieht das Argument, einen
Programmaufruf zu vermeiden, bei «printf» allermeist nicht mehr.
(2) Wenn sichergestellt ist, dass «"$Nummer"» immer eine
vorzeichenlose Zahl aus höchstens 6 Ziffern ist, kann man die
Mindestanzahl von Ziffern (hier: 6) erreichen, indem man zunÀchst
die entsprechende Anzahl (hier: 6) von Nullen vorne dranklebt.Â
Dadurch erhÀlt man eine Darstellung, die mindestens so viele
Ziffern wie nötig (hier: 6) hat.
Möglicherweise sind dann aber zu viele fĂŒhrende Nullen
vorhanden. Man muss dann vorne so viele Ziffern abschneiden,
dass 6 ĂŒbrig bleiben. Das kriegt man so hin:
Man schneidet zunĂ€chst testweise hinten die gewĂŒnschten 6 Ziffern
ab, um die Ziffern zu ermitteln, die vorne ĂŒberzĂ€hlig sind. Dann
schneidet man diese vorne ĂŒberflĂŒssigen Ziffern vorne von der
gesamten Ziffernfolge ab, um die gewĂŒnschten letzten 6 Ziffern zu
erhalten:
Nummer=000000"$Nummer" &&
Nummer="${Nummer#"${Nummer%??????}"}"
> mv $Name "Auszug"$Jahr$NullStr$Nummer".pdf"
mv -- "$Name" Auszug"${Jahr}_${Nummer}".pdf
Anmerkung/Rat:
Verwende Variablenauswertungen grundsÀtzlich immer in
AnfĂŒhrungszeichen («"$Variable"»), es sei denn, du möchtest die
besonderen Effekte, die eine Auswertung ohne AnfĂŒhrungszeichen
(«$Variable») verursacht, haben.
Die besonderen Effekte der Variablenauswertung ohne
AnfĂŒhrungszeichen sind folgende:Â Der Variableninhalt wird
anschlieĂend an allen Stellen, die eines aus der in der Variablen
«IFS» aufgezĂ€hlten Zeichen enthĂ€lt, in zwei Teile zerbrochen.Â
Dadurch erhÀlt man mehrere Teile statt nur einen. Je nachdem, ob
die ShellâOption «-f» ausâ oder eingeschaltet ist, wird das
Erhaltene anschlieĂend noch daraufhin untersucht, ob es
vielleicht Dateinamensmuster mit Jokerzeichen («*», «?», [âŠ])
darstellt, und, falls das der Fall ist, durch die Namen der auf
die Muster passenden Dateien ersetzt.
Dass der allermeist gewĂŒnschte Fall umstĂ€ndlicher â mit
AnfĂŒhrungszeichen â zu schreiben ist als der Spezialfall der
Sonderbehandlung â ohne AnfĂŒhrungszeichen â, dĂŒrfte der
historischen Entwicklung des Shells und seiner Skriptsprache
geschuldet sein.