[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bash:declare vs ksh:typeset




Zitat von Matthias Müller <matth_mueller_hbg@posteo.de>:

Hallo Christian,

Am Sonntag, 20. Mai 2018, 16:20:56 CEST schrieb Christian Knoke:
snip

Meines Wissens unterstützt bash keine Formate in der Zahlendarstellung,
weder intern noch extern.

So heisst es in "ARITHMETIC EVALUATION":
  "Evaluation is done in fixed-width integers with no check for overflow,
   though division by 0 is trapped and flagged as an error."

Das sind dann Strings.
Wahrscheinlich, habe ich beim Kopieren aus einem Korn-Shell-Script nicht
aufgepasst und eine fehlerhafte Zeile kopiert, Es macht bei int keinen Sinn
mit führenden Nullen. Es geht auch nicht um Arithmetik

Mir geht es um die Attribute: fixe Länge, führende Nullen und rechtsbündig,
das möglichst elegant.

Der eigentliche Sinn ist, dass aus einer CSV-Datei Nummern ausgelesen werden,
die unterschiedlich lang sind. Zur weiteren Verarbeitung/-wendung _müssen_ sie
aber eine fixe Länge haben.

Da gibts noch einen weiteren Fettnapf: Zahlen mit führenden Nullen sind für die bash Oktal.

printf -v str_WeiterVerw "%015d" "$(( 10#${str_GelesenerWert} ))"

sollte das tun, was du suchst.

Wenn allerdings noch Leerzeichen ins Spiel kommen, dann wird es komplizierter.
Die Variante

printf -v str_WeiterVerw "%015d" "$(( 10#${str_GelesenerWert// /} ))"

baut alle evtl. vorhandenen Leerzeichen aus. Wenn das zu radikal ist, dann muss man es evtl. etwas
'sanfter' formulieren, dann braucht es aber evtl. mehrere Zeilen.

Durch "typeset -Z15 str_WeiterVerw=${str_GelesenerWert}" (in der ksh) ist
garantiert, dass str_WeiterVerw immer 15stellig, ggf mit führenden Nullen und
rechtsbündig ist, egal welcher Wert gelesen wird.
Nachteil ist, dass gelesene Werte, die länger als (im Beispiel) 15 Zeichen
sind, links getrimmt werden. Ist in diesem Fall aber egal.

Gruß, Christian



Reply to: