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.