Discussion:
Anzahl der Stellen einer Zahl feststellen
(zu alt für eine Antwort)
Wolfgang Klein
2017-09-02 18:22:32 UTC
Permalink
Moin!

Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen. Da gibt es doch den Logarithmus zur Basis 10 und dachte
eigentlich, daß

echo "scale=0;l($zahl)/l(10)" | bc -l

das Gewünschte ausspuckt. Aber weit gefehlt, denn:

echo "scale=0;l(10)/l(10)" | bc -l
1

echo "scale=0;l(77)/l(10)" | bc -l
2

echo "scale=0;l(999)/l(10)" | bc -l
3

echo "scale=0;l(177)/l(10)" | bc -l
2

Die ersten beiden Ergebnisse müssten jeweils 2 lauten, die letzten
beiden jeweils 3.

Wie kriege ich das gesuchte Ergebnis?

Wolfgang
Stefan Kanthak
2017-09-02 18:34:48 UTC
Permalink
Post by Wolfgang Klein
Moin!
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen. Da gibt es doch den Logarithmus zur Basis 10 und dachte
eigentlich, daß
echo "scale=0;l($zahl)/l(10)" | bc -l
[...]
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
${#zahl}

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
Andreas Kohlbach
2017-09-02 19:57:23 UTC
Permalink
Post by Wolfgang Klein
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen. Da gibt es doch den Logarithmus zur Basis 10 und dachte
eigentlich, daß
echo "scale=0;l($zahl)/l(10)" | bc -l
echo "scale=0;l(10)/l(10)" | bc -l
1
echo "scale=0;l(77)/l(10)" | bc -l
2
echo "scale=0;l(999)/l(10)" | bc -l
3
echo "scale=0;l(177)/l(10)" | bc -l
2
Die ersten beiden Ergebnisse müssten jeweils 2 lauten, die letzten
beiden jeweils 3.
Wie kriege ich das gesuchte Ergebnis?
"wc -c" macht das - fast. Man muss noch einen abziehen.
--
Andreas
You know you are a redneck if
your satellite dish payment delays buying school clothes for the kids.
Wolfgang Klein
2017-09-03 07:39:32 UTC
Permalink
Post by Andreas Kohlbach
"wc -c" macht das - fast. Man muss noch einen abziehen.
Danke, funktioniert! :)

Aber irgendwie lässt mich die Sache mit dem Logarithmus nicht los, da
muss ich meine angestaubten Mathe-Kenntnisse wohl mal auffrischen...



Wolfgang
Tim Landscheidt
2017-09-03 21:17:07 UTC
Permalink
Post by Wolfgang Klein
Post by Andreas Kohlbach
"wc -c" macht das - fast. Man muss noch einen abziehen.
Danke, funktioniert! :)
Aber irgendwie lässt mich die Sache mit dem Logarithmus nicht los, da
muss ich meine angestaubten Mathe-Kenntnisse wohl mal auffrischen...
IIRC funktioniert Deine Idee prinzipiell, aber man muss im-
mer abrunden und 1 addieren (hier in SQL):

| tim=# SELECT i, LOG(i), FLOOR(LOG(i)) + 1, LENGTH(i::TEXT) FROM (VALUES (1), (9), (10), (99), (100), (999), (1000)) AS d (i) ORDER BY i;
| i | log | ?column? | length
| ------+-------------------+----------+--------
| 1 | 0 | 1 | 1
| 9 | 0.954242509439325 | 1 | 1
| 10 | 1 | 2 | 2
| 99 | 1.99563519459755 | 2 | 2
| 100 | 2 | 3 | 3
| 999 | 2.99956548822598 | 3 | 3
| 1000 | 3 | 4 | 4
| (7 Zeilen)

| tim=#

Ein Abrunden, das heißt Abschneiden der Nachkommastellen,
scheint in bc nur mit einem Zwischenschritt möglich zu sein:

| [***@passepartout ~]$ for i in 1 9 10 99 100 999 1000; do echo -n "$i: "; echo "r=l($i)/l(10)+1; scale=0; r/1" | bc -l; done
| 1: 1
| 9: 1
| 10: 2
| 99: 2
| 100: 3
| 999: 3
| 1000: 4
| [***@passepartout ~]$

Tim
Wolfgang Klein
2017-09-04 14:45:38 UTC
Permalink
Post by Tim Landscheidt
IIRC funktioniert Deine Idee prinzipiell,
Da bin ich ja froh, zeigt es doch, daß mich meine Mathekenntnisse nicht
gänzlich im Stich gelassen haben. ;)
Jaaaaa *face palm*

Das Abrunden habe ich vergessen... "Integer" (scale=0) reicht nicht!

Danke! :)


Aber, was das tollste ist: wieder einmal habe ich die Bash unterschätzt,
denn

stellen=${#variable}

macht genau das, was ich suchte, und zwar unabhängig davon, ob $variable
einen echten numerischen Wert oder eine Zeichenkette enthält.

Das ist jedoch nicht schlimm, denn die logarithmische Diskussion war den
kleinen Umweg wert. :)


Wolfgang
Marcel Logen
2017-09-03 16:31:22 UTC
Permalink
Post by Andreas Kohlbach
Post by Wolfgang Klein
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen.
[...]
Post by Andreas Kohlbach
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
"wc -c" macht das - fast. Man muss noch einen abziehen.
Meinst Du: bei Verwendung von "echo"?

Wenn man "echo -n" benutzt, ist das Abziehen nicht nötig.

| $ zahl=3216549870
| $ echo -n "$zahl" | wc -c
| 10

Marcel
--
+-----+ +---------+ +-+ +-+ +---+
+---+ +--+ +-+ +-+ +--+ +---+ +---+ +--+ +----+ +-
+ +-+ +-+ +----+ +--+ +-+ +-+ +-+ +---+ +---+
+---+ +--+ +------------+ +----------+ +----------+
Andreas Kohlbach
2017-09-03 20:49:00 UTC
Permalink
Post by Marcel Logen
Post by Andreas Kohlbach
Post by Wolfgang Klein
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen.
[...]
Post by Andreas Kohlbach
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
"wc -c" macht das - fast. Man muss noch einen abziehen.
Meinst Du: bei Verwendung von "echo"?
Wenn man "echo -n" benutzt, ist das Abziehen nicht nötig.
| $ zahl=3216549870
| $ echo -n "$zahl" | wc -c
| 10
Cool.

Ich hatte auf die Schnelle

| ~$ echo 0123456789|wc -c
| 11

gemacht. An

| ~$ echo -n 0123456789|wc -c
| 10

hatte ich gar nicht gedacht, obwohl es offensichtlich gewesen sein müsste.
--
Andreas
You know you are a redneck if
the most commonly heard phrase at your family reunion is
"what the hell are you looking at, shithead?"
Michael Bäuerle
2017-09-04 08:02:13 UTC
Permalink
Post by Andreas Kohlbach
[...]
Ich hatte auf die Schnelle
| ~$ echo 0123456789|wc -c
| 11
gemacht. An
| ~$ echo -n 0123456789|wc -c
| 10
hatte ich gar nicht gedacht, obwohl es offensichtlich gewesen sein müsste.
POSIX sagt zu echo und "-n":
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html>
|
| echo [string...]
| [...]
| A string to be written to standard output. If the first operand is -n,
| or if any of the operands contain a <backslash> character, the results
| are implementation-defined.

Portable Variante:
|
| $ printf '%s' '0123456789' | wc -c
| 10
Stefan Kanthak
2017-09-04 13:21:12 UTC
Permalink
Post by Michael Bäuerle
Post by Andreas Kohlbach
[...]
Ich hatte auf die Schnelle
| ~$ echo 0123456789|wc -c
| 11
gemacht. An
| ~$ echo -n 0123456789|wc -c
| 10
hatte ich gar nicht gedacht, obwohl es offensichtlich gewesen sein müsste.
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html>
|
| echo [string...]
| [...]
| A string to be written to standard output. If the first operand is -n,
| or if any of the operands contain a <backslash> character, the results
| are implementation-defined.
|
| $ printf '%s' '0123456789' | wc -c
| 10
Ist genauso ueberfluessig wie echo ... | wc -c : ${#variable} existiert!
Siehe <news:ooetpq$973$***@news.mixmin.net> in diesem Thread.

Stefan
[
--
Die unaufgeforderte Zusendung werbender E-Mails verstoesst gegen §823
Abs. 1 sowie §1004 Abs. 1 BGB und begruendet Anspruch auf Unterlassung.
Beschluss des OLG Bamberg vom 12.05.2005 (AZ: 1 U 143/04)
J***@fokus.fraunhofer.de
2017-09-06 08:42:24 UTC
Permalink
Post by Michael Bäuerle
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html>
|
| echo [string...]
| [...]
| A string to be written to standard output. If the first operand is -n,
| or if any of the operands contain a <backslash> character, the results
| are implementation-defined.
Das ist eine Fehlinterpretation.

Der Mensch, der für die POSIX Testsuite zuständig ist sagt dazu:

Ein System, daß nicht alle mit XSI gekennzeichneten Erweiterungen
implementiert, kann nor als "Embedded System" zertifiziert werden.

Daher: wer ernstzunehmende POSIX Kompatibilität anbieten will, muß schon ein
richtig funktionierendes echo liefern.
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Michael Bäuerle
2017-09-06 09:23:13 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html>
|
| echo [string...]
| [...]
| A string to be written to standard output. If the first operand is -n,
| or if any of the operands contain a <backslash> character, the results
| are implementation-defined.
Das ist eine Fehlinterpretation.
Ein System, daß nicht alle mit XSI gekennzeichneten Erweiterungen
implementiert, kann nor als "Embedded System" zertifiziert werden.
Daher: wer ernstzunehmende POSIX Kompatibilität anbieten will, muß schon ein
richtig funktionierendes echo liefern.
Es ging hier aber um "-n". Und ich sehe da nichts, dass irgendein System
"-n" unterstützen müsste - auch eines mit XSI-Extension nicht.
J***@fokus.fraunhofer.de
2017-09-06 10:28:38 UTC
Permalink
Post by Michael Bäuerle
Post by J***@fokus.fraunhofer.de
Ein System, daß nicht alle mit XSI gekennzeichneten Erweiterungen
implementiert, kann nor als "Embedded System" zertifiziert werden.
Daher: wer ernstzunehmende POSIX Kompatibilität anbieten will, muß schon ein
richtig funktionierendes echo liefern.
Es ging hier aber um "-n". Und ich sehe da nichts, dass irgendein System
"-n" unterstützen müsste - auch eines mit XSI-Extension nicht.
Ich hatte schon POSIX gemeint als ich es geschrieben habe. Daher:

- kein -n

- aber \c und andere POSIX Escapes
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Michael Bäuerle
2017-09-06 11:32:36 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
Post by J***@fokus.fraunhofer.de
Ein System, daß nicht alle mit XSI gekennzeichneten Erweiterungen
implementiert, kann nor als "Embedded System" zertifiziert werden.
Daher: wer ernstzunehmende POSIX Kompatibilität anbieten will, muß schon ein
richtig funktionierendes echo liefern.
Es ging hier aber um "-n". Und ich sehe da nichts, dass irgendein System
"-n" unterstützen müsste - auch eines mit XSI-Extension nicht.
- kein -n
- aber \c und andere POSIX Escapes
Es ging mir ja genau darum "-n" zu ersetzen.
In <news:***@WStation5.stz-e.de> hatte ich statt:

echo -n 0123456789 | wc -c

das hier:

printf '%s' '0123456789' | wc -c

empfohlen (als portablere Lösung). Die XSI-Variante mit echo und "\c"
mag auch konform sein, sie funktioniert aber heute fast nirgends mehr
(nicht auf GNU- und nicht auf BSD- basierten Systemen):
|
| $ uname
| Linux
| $ getconf _POSIX_VERSION
| 200809
| $ getconf _XOPEN_UNIX
| 1
| $ getconf _XOPEN_VERSION
| 700
| $ /bin/echo "Bla\c"
| Bla\c
| $

| $ uname
| NetBSD
| $ getconf _POSIX_VERSION
| 200112
| $ getconf _XOPEN_UNIX
| getconf: _XOPEN_UNIX: unknown variable
| $ getconf _XOPEN_VERSION
| getconf: _XOPEN_VERSION: unknown variable
| $ /bin/echo "Bla\c"
| Bla\c
| $

NetBSD behauptet auch nicht XSI zu unterstützen [1], sogesehen ist das
dort zu erwarten.

BTW: Auch diverse Builtins von echo in Shells sind nicht XSI-konform.


____________
[1] <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap02.html#tag_02_01_04>
J***@fokus.fraunhofer.de
2017-09-06 12:04:09 UTC
Permalink
Post by Michael Bäuerle
echo -n 0123456789 | wc -c
printf '%s' '0123456789' | wc -c
empfohlen (als portablere Lösung). Die XSI-Variante mit echo und "\c"
mag auch konform sein, sie funktioniert aber heute fast nirgends mehr
Nun, diese Systeme haben wohl nie versucht die Testsuite zu erfüllen.

bash kann man jedenfalls so kompilieren, daß echo korrekt funktioniert (siehe
bash auf Solaris).
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Michael Bäuerle
2017-09-06 12:43:52 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
echo -n 0123456789 | wc -c
printf '%s' '0123456789' | wc -c
empfohlen (als portablere Lösung). Die XSI-Variante mit echo und "\c"
mag auch konform sein, sie funktioniert aber heute fast nirgends mehr
Nun, diese Systeme haben wohl nie versucht die Testsuite zu erfüllen.
Solche Systeme sind aber heute allgegenwärtig. Oft muss man nehmen was
da ist.
Post by J***@fokus.fraunhofer.de
bash kann man jedenfalls so kompilieren, daß echo korrekt funktioniert (siehe
bash auf Solaris).
Macht aber wohl so gut wie niemand.
BTW: Auf meinem GNU/Linux funktioniert es auch mit der ksh nicht:
|
| $ uname
| Linux
| $ ksh whatshell.sh
| ksh93 Version AJM 93u+ 2012-08-01
| $ ksh
| $ echo "Bla\c"
| Bla\c
| $

Auf NetBSD taugt das dagegen als Workaround:
|
| $ uname
| NetBSD
| $ ksh whatshell.sh
| @(#)PD KSH v5.2.14 99/07/13.2
| $ ksh
| $ echo "Bla\c"
| Bla$

Fazit:
In der realen Welt ist echo ohne Zeilenumbruch am Ende nicht portabel,
egal was offiziell genormt ist.
J***@fokus.fraunhofer.de
2017-09-06 14:18:12 UTC
Permalink
Post by Michael Bäuerle
Post by J***@fokus.fraunhofer.de
bash kann man jedenfalls so kompilieren, daß echo korrekt funktioniert (siehe
bash auf Solaris).
Macht aber wohl so gut wie niemand.
|
| $ uname
| Linux
| $ ksh whatshell.sh
| ksh93 Version AJM 93u+ 2012-08-01
| $ ksh
| $ echo "Bla\c"
| Bla\c
| $
Da hat wohl jemand den Code zerstört.

ksh93v
$ echo "bla\crr"
bla$

Das ist die Original Source kompiliert....
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Michael Bäuerle
2017-09-06 14:52:13 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
Post by J***@fokus.fraunhofer.de
bash kann man jedenfalls so kompilieren, daß echo korrekt funktioniert (siehe
bash auf Solaris).
Macht aber wohl so gut wie niemand.
|
| $ uname
| Linux
| $ ksh whatshell.sh
| ksh93 Version AJM 93u+ 2012-08-01
| $ ksh
| $ echo "Bla\c"
| Bla\c
| $
Da hat wohl jemand den Code zerstört.
Vermutlich mit voller Absicht. Die BSD-Variante von echo ist so weit
verbreitet, die wird so schnell nicht mehr verschwinden.
Post by J***@fokus.fraunhofer.de
ksh93v
$ echo "bla\crr"
bla$
Das ist die Original Source kompiliert....
Bevor man ein neues echo oder eine neue Shell compiliert, nimmt man
dann doch besser gleich printf. Die offizielle Empfehlung [1] lautet
ja auch so:
|
| APPLICATION USAGE
| [...]
| New applications are encouraged to use printf instead of echo.


______________
[1] <http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html>
J***@fokus.fraunhofer.de
2017-09-07 12:00:07 UTC
Permalink
Post by Michael Bäuerle
Bevor man ein neues echo oder eine neue Shell compiliert, nimmt man
dann doch besser gleich printf. Die offizielle Empfehlung [1] lautet
Leider sind die meisten printf Implementierungen unbenutzbar defekt.

Versuche mal: printf '%b\n' '123\0ab'

Auf Ubuntu liefert das immer noch "123"
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Michael Bäuerle
2017-09-07 12:59:03 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
Bevor man ein neues echo oder eine neue Shell compiliert, nimmt man
dann doch besser gleich printf. Die offizielle Empfehlung [1] lautet
Leider sind die meisten printf Implementierungen unbenutzbar defekt.
Versuche mal: printf '%b\n' '123\0ab'
Auf Ubuntu liefert das immer noch "123"
Mangels Ubuntu:

| $ uname
| NetBSD
| $ command -v printf
| printf
| $ printf '%b\n' '123\0ab'
| 123ab
(Built-in der bash)
| $ /bin/sh
| $ command -v printf
| printf
| $ printf '%b\n' '123\0ab'
| 123ab
(Built-in der ash)
| /usr/bin/printf '%b\n' '123\0ab'
| 123ab
| $ /usr/bin/printf '%b\n' '123\0ab' | od -t x1
| 0000000 31 32 33 00 61 62 0a

| $ uname
| Linux
(Slackware)
| $ command -v printf
| printf
| $ printf '%b\n' '123\0ab'
| 123ab
(Built-in der bash)
| $ /bin/ksh
| $ command -v printf
| printf
| $ printf '%b\n' '123\0ab'
| 123ab
(Built-in der ksh)
| $ /usr/bin/printf '%b\n' '123\0ab'
| 123ab
| $ /usr/bin/printf '%b\n' '123\0ab' | od -t x1
| 0000000 31 32 33 00 61 62 0a

Sieht IMHO gut aus. Irgendwo wird immer irgendwas kaputt sein.
printf macht aber weniger Probleme als echo finde ich.
Helmut Schellong
2017-09-07 20:11:12 UTC
Permalink
On 09/07/2017 14:59, Michael Bäuerle wrote:
[...]
Post by Michael Bäuerle
Sieht IMHO gut aus. Irgendwo wird immer irgendwas kaputt sein.
printf macht aber weniger Probleme als echo finde ich.
ksh hat print, u.a. mit den Optionen -nru# (bsh ebenfalls).

406] expr -config : lg
expr: illegal option -- c
expr: usage: expr [-e] expression
407] expr -e -config : lg
expr: illegal option -- c
expr: usage: expr [-e] expression
408] expr -e x-config : lg
409]

Was nützt -e, wenn diese Option nicht funktioniert?
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Marc Haber
2017-09-07 15:48:44 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
Bevor man ein neues echo oder eine neue Shell compiliert, nimmt man
dann doch besser gleich printf. Die offizielle Empfehlung [1] lautet
Leider sind die meisten printf Implementierungen unbenutzbar defekt.
Versuche mal: printf '%b\n' '123\0ab'
Auf Ubuntu liefert das immer noch "123"
Selbst auf dem deutlich alten Debian 7 kommt "123ab". Auf neueren
sowieso.

Von welchem Ubuntu sprichst Du?

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
J***@fokus.fraunhofer.de
2017-09-08 08:06:38 UTC
Permalink
Post by Marc Haber
Post by J***@fokus.fraunhofer.de
Auf Ubuntu liefert das immer noch "123"
Selbst auf dem deutlich alten Debian 7 kommt "123ab". Auf neueren
sowieso.
Hast Du das auch korrekt mit dem Systemshell getestet?

Wenn ich das mit meinem bosh auf Ubuntu teste, dann funktioniert es auch
korrekt.
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Tim Landscheidt
2017-09-08 19:06:51 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Marc Haber
Post by J***@fokus.fraunhofer.de
Auf Ubuntu liefert das immer noch "123"
Selbst auf dem deutlich alten Debian 7 kommt "123ab". Auf neueren
sowieso.
Hast Du das auch korrekt mit dem Systemshell getestet?
[…]
Für Deine wirren Gedankensprünge das Wort „korrekt“ zu ver-
wenden, zeugt von gewaltigen cojones. Respekt!

Tim
Marc Haber
2017-09-09 08:02:06 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Marc Haber
Post by J***@fokus.fraunhofer.de
Auf Ubuntu liefert das immer noch "123"
Selbst auf dem deutlich alten Debian 7 kommt "123ab". Auf neueren
sowieso.
Hast Du das auch korrekt mit dem Systemshell getestet?
Da hast Du mich erwischt. Ich bin mit den Shell-Animositäten der 80er
nicht so vertraut, ich mache Linux erst seit 1998, und scheine einen
guten Grund dafür zu haben, dass ich in meine Shellscripts immer
#!/bin/bash schreibe.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
Diedrich Ehlerding
2017-09-07 18:08:04 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Leider sind die meisten printf Implementierungen unbenutzbar defekt.
Versuche mal: printf '%b\n' '123\0ab'
Auf Ubuntu liefert das immer noch "123"
Welche Implementierung denn konkret? Auf meiner schon etwas ältereen
opensuse:

***@diedrich:~> bash --version
GNU bash, Version 4.2.53(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger
<http://gnu.org/licenses/gpl.html>

Dies ist freie Software. Sie darf verändert und verteilt werden.
Für dieses Programm besteht keinerlei Garantie.
***@diedrich:~> printf '%b\n' '123\0ab'
123ab
***@diedrich:~>
J***@fokus.fraunhofer.de
2017-09-08 08:05:07 UTC
Permalink
Post by Diedrich Ehlerding
Post by J***@fokus.fraunhofer.de
Leider sind die meisten printf Implementierungen unbenutzbar defekt.
Versuche mal: printf '%b\n' '123\0ab'
Auf Ubuntu liefert das immer noch "123"
Welche Implementierung denn konkret? Auf meiner schon etwas ältereen
GNU bash, Version 4.2.53(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder jünger
<http://gnu.org/licenses/gpl.html>
Bash ist nicht der Systemshell.....
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Diedrich Ehlerding
2017-09-09 07:05:31 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Bash ist nicht der Systemshell.....
Ich stehe auf der Leitung. Welche Shell hättest du denn gerne?
Bei mir liefern bash, /bin/sh, ksh, csh, tcsh alle dasselbe Ergebnis.
Sven Joachim
2017-09-09 07:19:04 UTC
Permalink
Post by Diedrich Ehlerding
Post by J***@fokus.fraunhofer.de
Bash ist nicht der Systemshell.....
Ich stehe auf der Leitung. Welche Shell hättest du denn gerne?
Bei mir liefern bash, /bin/sh, ksh, csh, tcsh alle dasselbe Ergebnis.
Mit Systemshell meint Joerg anscheinend /bin/sh, die auf Debian/Ubuntu
von dash bereitgestellt wird, welche viele Fehler hat, unter anderem
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=379227.

Ist in dash 0.5.9 behoben worden, aber dash in Debian ist unmaintained,
deshalb wird es wohl noch einige Jahrzehnte dauern, bis der Fix dort
ankommt, falls überhaupt.

Sven
Marc Haber
2017-09-09 07:50:06 UTC
Permalink
Post by Sven Joachim
Ist in dash 0.5.9 behoben worden, aber dash in Debian ist unmaintained,
Für ein Tool, das _Debian_ im Namen hat, entbehrt das nicht einer
gewissen Komik.

Grüße
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
Thomas Hochstein
2017-09-16 16:53:03 UTC
Permalink
Post by Marc Haber
Post by Sven Joachim
Ist in dash 0.5.9 behoben worden, aber dash in Debian ist unmaintained,
Für ein Tool, das _Debian_ im Namen hat, entbehrt das nicht einer
gewissen Komik.
Naja, dash hat durchaus einen Maintainer (Gerrit Pape), der allerdings
in den letzten 3-5 Jahren offenbar nicht sehr aktiv war.

(Der letzte NMU von dash ist aber aus dem Juni.)

-thh

Martin Vaeth
2017-09-11 13:40:23 UTC
Permalink
Post by Sven Joachim
Mit Systemshell meint Joerg anscheinend /bin/sh, die auf Debian/Ubuntu
von dash bereitgestellt wird [...]
aber dash in Debian ist unmaintained,
D.h. die Systemshell von Debian ist unmaintained!?
Wenn das stimmt, ist Debian keine ernstzunehmende Distribution mehr.
Helmut Waitzmann
2017-09-09 21:11:36 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
Bevor man ein neues echo oder eine neue Shell compiliert, nimmt man
dann doch besser gleich printf. Die offizielle Empfehlung [1] lautet
Leider sind die meisten printf Implementierungen unbenutzbar defekt.
Versuche mal: printf '%b+AFw-n' '123+AFw-0ab'
Auf Ubuntu liefert das immer noch "123"
Selbst das uralte Debian 6 kriegt das schon richtig hin, sofern man das
Standalone-+ALs-printf+AKs- verwendet

( exec printf '%b' '123+AFw-0000ab' ) | od -t x1c -A n
31 32 33 00 61 62
1 2 3 +AFw-0 a b

oder+AKAgEw- wenn man das Shell-Builtin +ALs-printf+AKs- nutzen will+AKAgEw- man das +ALs-bash+AKs-
verwendet, egal, ob in der Betriebsart +ALs-bash+AKs- oder in der
POSIX-Kompatibilit+AOQ-tsbetriebsart. Das +ALs-dash+AKs--Builtin +ALs-printf+AKs-
scheitert:

(
execlp()
{
exec bash -c -- '
file="${1?}" && shift &&
if test "$#" -ge 1
then
arg0="${1}" && shift
fi &&
exec ${arg0+--a} ${arg0+-"$arg0"} -- "$file" "$@"
' bash "$@"
} &&
for shell in 'bash bash' 'bash sh' 'dash sh'
do
eval "set '' ${shell}" && shift &&
printf '+AFw-nMit %s als %s:+AFw-n' "$1" "$2" &&
(
execlp "$1" "$2" -c -- '"$@"' "$2" +AFw-
printf '%b' '123+AFw-0000ab'
) | od -t x1c -A n
done
)

Mit bash als bash:
31 32 33 00 61 62
1 2 3 +AFw-0 a b

Mit bash als sh:
31 32 33 00 61 62
1 2 3 +AFw-0 a b

Mit dash als sh:
31 32 33
1 2 3
J***@fokus.fraunhofer.de
2017-09-11 09:33:18 UTC
Permalink
Post by Michael Bäuerle
31 32 33
1 2 3
Oder nochmal in Worten: Der Systemshell kanns nicht korrekt.
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sf.net/projects/schilytools/files/
Helmut Waitzmann
2017-09-11 12:34:32 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Michael Bäuerle
31 32 33
1 2 3
Oder nochmal in Worten: Der Systemshell kanns nicht korrekt.
Nein. Der Systemshell war bereits bei Debian 6 vom Administrator
wählbar. Der »Systemshell« ist der Shell, der gestartet wird,
wenn »execve("/bin/sh«", ...)« aufgerufen wird.

Die von Dir zitierte Ausgabe des Systemshell‐Builtins »printf«
erhält man, wenn »dash« als Systemshell konfiguriert ist.

Ist »bash« als Systemshell konfiguriert, erhält man die unter »Mit
bash als sh« genannte Ausgabe.
Sieghard Schicktanz
2017-09-03 18:59:45 UTC
Permalink
Hallo Andreas,
Post by Andreas Kohlbach
Post by Wolfgang Klein
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen. Da gibt es doch den Logarithmus zur Basis 10 und dachte
eigentlich, daß
echo "scale=0;l($zahl)/l(10)" | bc -l
echo "scale=0;l(10)/l(10)" | bc -l
1
echo "scale=0;l(77)/l(10)" | bc -l
2
echo "scale=0;l(999)/l(10)" | bc -l
3
echo "scale=0;l(177)/l(10)" | bc -l
2
Die ersten beiden Ergebnisse müssten jeweils 2 lauten, die letzten
beiden jeweils 3.
Wie kriege ich das gesuchte Ergebnis?
Tja, da scheint der "bc" irgendwo eine Rundung zu machen. Das ist recht
sicher die Ursache, wenn die Stellenzahl ab der Mitte des Bereichs (5, 50,
500...) auf den nächsthöheren Wert springt. Dann müßte der Logaritmus des
umzurechnenden Werts mit einer _Ab_rundungsfunktion "zurechtgestutzt"
werden.
Aber wenn die Stellenzahl bestimmt werden soll, dann ist es doch am
einfachsten, die Stellen abzuzählen?
Post by Andreas Kohlbach
"wc -c" macht das - fast. Man muss noch einen abziehen.
Ja, sicher - "wc" kann Zeichen zählen. Und mehr...

Warum, wenn das eh schon in der "bash" laufen soll, nicht die selber zählen
lassen? So nach dem Muster vielleicht:

for X in 2 34 567 8901; do echo "$X: ${#X}"; done

Klappt natürlich nur für ganze Zahlen und nur ohne weiteren Text. Sonst muß
der Wert noch "vorbehandelt" werden (kann die "bash" auch).
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Stefan Ram
2017-09-03 11:35:34 UTC
Permalink
Post by Wolfgang Klein
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen.
Eine Zahl hat keine Stellen, höchstens ein Numerale hat
Stellen. Aber auch hier muß man erst definieren, was man
darunter versteht.

Wie viele Stellen soll beispielsweise das Numerale

0022.2200

haben? Ok, ich sehe, daß es Dir anscheinend um
nicht-negative ganzzahlige dezimale Numeralia geht,
die nicht mit unnötigen Nullen beginnen.
Post by Wolfgang Klein
echo "scale=0;l(177)/l(10)" | bc -l
2
Wie kriege ich das gesuchte Ergebnis?
Was hier mit bc geht:

echo "r=l(1)/l(10)+1;scale=0;r/1" | bc -l
1

echo "r=l(9)/l(10)+1;scale=0;r/1" | bc -l
1

echo "r=l(10)/l(10)+1;scale=0;r/1" | bc -l
2

echo "r=l(99)/l(10)+1;scale=0;r/1" | bc -l
2

echo "r=l(100)/l(10)+1;scale=0;r/1" | bc -l
3

echo "r=l(999)/l(10)+1;scale=0;r/1" | bc -l
3

echo "r=l(1000)/l(10)+1;scale=0;r/1" | bc -l
4

Dies geht aber nicht für die Zahl »0«.

Man beachte auch:

echo "r=l(9.99999999999)/l(10)+1;scale=0;r/1" | bc -l
1

echo "r=l(9.9999999999999999999999999999)/l(10)+1;scale=0;r/1" | bc -l
2

echo "r=l(99999999999999999999999999999)/l(10)+1;scale=0;r/1" | bc -l
30

Es sind aber 29 Neunen.

Für ganzzahlige Numeralia ist es daher fragwürdig,
den Weg über Gleitkommaberechnungen zu gehen.
Joerg Mertens
2017-09-04 19:10:00 UTC
Permalink
Post by Wolfgang Klein
Moin!
Ich versuche, in einer Bash die Anzahl der Stellen einer Zahl zu
bestimmen. Da gibt es doch den Logarithmus zur Basis 10 und dachte
eigentlich, daß
echo "scale=0;l($zahl)/l(10)" | bc -l
echo "scale=0;l(10)/l(10)" | bc -l
1
echo "scale=0;l(77)/l(10)" | bc -l
2
echo "scale=0;l(999)/l(10)" | bc -l
3
echo "scale=0;l(177)/l(10)" | bc -l
2
Die ersten beiden Ergebnisse müssten jeweils 2 lauten, die letzten
beiden jeweils 3.
Wie kriege ich das gesuchte Ergebnis?
Wolfgang
jme:~$ echo "length(10)" | bc
2
jme:~$ echo "length(177)" | bc
3
Helmut Harnisch
2017-09-06 12:01:10 UTC
Permalink
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
evtl. so?

echo `expr length 12345678`
Diedrich Ehlerding
2017-09-06 18:23:29 UTC
Permalink
Post by Helmut Harnisch
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
evtl. so?
echo `expr length 12345678`
"length" ist eine gute gute Idee, kannte ich nicht - aber warum so
kompliziert? "echo `irgendwas`" gibt genau das aus, was "irgendwas"
ausgibt. Also einfacher:

expr length 12345678
Sieghard Schicktanz
2017-09-06 19:16:41 UTC
Permalink
Hallo Helmut,
Post by Helmut Harnisch
Post by Wolfgang Klein
Wie kriege ich das gesuchte Ergebnis?
evtl. so?
echo `expr length 12345678`
Vielleicht schreibt auch mal wer ein Java-Programm dafür, das den Aufruf
per internet auf einem Google-Server ausführt?
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Loading...