Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Bash:declare vs ksh:typeset

150 views
Skip to first unread message

Matthias Müller

unread,
May 20, 2018, 10:00:02 AM5/20/18
to
Hallo an Alle,

in einem Buch (1) zur bash steht, dass der built-in "typeset" nur aus
Kompatibilitätsgründen zu ksh vorhanden ist und man doch "declare" verwenden
solle. In anderen Dokus (zB 2), die ich konsultiert habe, steht das gleiche.

"bash.declare" fehlt jedoch ein Feature, das "ksh.typeset" hat:
Mit
typeset -iZ15 int_VarName
kann ich der Variablen int_VarName folgende Attribute zuweisen:
Datentyp integer -> geht mit bash.declare
fixe Länge von 15 Stellen -> geht _nicht_ mit bash.declare
rechtsbündig ausgerichtet -> geht _nicht_ mit bash.declare
fehlende Stellen nach links werden mit Nullen aufgefüllt -> geht _nicht_ mit
bash.declare

Meine Frage: Kann ich das mit irgendeinem bash-builtin auch so elegant
erreichen? Wenn ja, wie?

Irgendwie werde ich nicht fündig.

(1): Karsten Günther, Thorsten Zilm; Bash 3.0 - GE-PACKT; 2. Auflage; mitp/
bhv; ISBN-13: 978-3826615542
(2): man 1 bash

--
Mit freundlichen Grüßen
Matthias Müller
(Benutzer #439779 im Linux-Counter http://counter.li.org)
PS: Bitte senden Sie als Antwort auf meine E-Mails reine Text-Nachrichten!
signature.asc

Christian Knoke

unread,
May 20, 2018, 10:30:03 AM5/20/18
to

Hallo!

Matthias Müller schrieb am 20. Mai um 15:57 Uhr:

> "bash.declare" fehlt jedoch ein Feature, das "ksh.typeset" hat:
> Mit
> typeset -iZ15 int_VarName
> kann ich der Variablen int_VarName folgende Attribute zuweisen:
> Datentyp integer -> geht mit bash.declare
> fixe Länge von 15 Stellen -> geht _nicht_ mit bash.declare
> rechtsbündig ausgerichtet -> geht _nicht_ mit bash.declare
> fehlende Stellen nach links werden mit Nullen aufgefüllt -> geht _nicht_ mit
> bash.declare
>
> Meine Frage: Kann ich das mit irgendeinem bash-builtin auch so elegant
> erreichen? Wenn ja, wie?

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.

~$ echo $((0004))
4

Gruß
Christian

> Irgendwie werde ich nicht fündig.
>
> (1): Karsten Günther, Thorsten Zilm; Bash 3.0 - GE-PACKT; 2. Auflage; mitp/
> bhv; ISBN-13: 978-3826615542
> (2): man 1 bash

> Mit freundlichen Grüßen
> Matthias Müller

--
*** Christian Knoke * 25541 Brunsbüttel * http://cknoke.de ***

Matthias Müller

unread,
May 20, 2018, 11:50:02 AM5/20/18
to
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.

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.

--
Mit freundlichen Grüßen
Matthias Müller
signature.asc

Christian Knoke

unread,
May 20, 2018, 12:20:03 PM5/20/18
to

Hallo Matthias,

Matthias Müller schrieb am 20. Mai um 17:48 Uhr:
> Am Sonntag, 20. Mai 2018, 16:20:56 CEST schrieb Christian Knoke:

> > 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.

Achso. Du suchst printf. Das gibt es als built-in *und* als Dienstprogramm.

> 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.

Das gibt es wie gesagt in der bash nicht.

> 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

Christian Andretzky

unread,
May 20, 2018, 12:50:03 PM5/20/18
to

Zitat von Matthias Müller <matth_mu...@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

Matthias Müller

unread,
May 21, 2018, 4:20:02 PM5/21/18
to
Hallo an Alle,

Am Sonntag, 20. Mai 2018, 16:35:02 CEST schrieb Christian Andretzky:
snip
> > 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.
Die Werte sind ohne Leerzeichen, für andere Anwendungsfälle werde ich
(hoffentlich) dran denken.

>
> printf -v str_WeiterVerw "%015d" "$(( 10#${str_GelesenerWert} ))"
Das war die Lösung

Herzlichen Dank dafür, auch an Christian Knoke, der auch printf vorschlug.
Bash ist für mich Neuland, deshalb sind die Eigenheiten noch nicht so im
Fokus. Ich habe viel für die Korn-Shell unter dem Betriebssystem AIX gemacht
und muss das eine oder andere Skript portieren.
signature.asc
0 new messages