ubuntuusers.de

BASH: RegExp isNumeric

Status: Ungelöst | Ubuntu-Version: Kubuntu 20.04 (Focal Fossa)
Antworten |

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1246

Danke an rklm und kB für die Hinweise.

Für mich war das Stichwort "composite patterns" hilfreich. Zu meiner Schande muss ich gestehen, dass ich die Teile zwar gelesen aber anders verstanden hatte. Aus diesem Grund hatte ich die RegEx immer in eingetretenen Pfaden benutzt.

Man lernt halt nie aus. Das was ich als Gruppierungsklammer gesehen hatte ist in Wirklichkeit der Begrenzer für die pattern-list. Das erklärt, warum bei dem +(...) Konstrukt keine Array-Zuordnungen z.B. bei ${BASH_REMATCH[1]} erfolgte wie dies bei ^([0-9]+)$ festgestellt werden kann.

uint () [[ $* == +([0-9]) ]] 
uint "456" ; echo $?:${BASH_REMATCH[1]}
0:
uint () [[ $* =~ +([0-9]) ]] 
uint "456" ; echo $?:${BASH_REMATCH[1]}
2:
uint () [[ $* =~ ^([0-9]*)$ ]] 
uint "456" ; echo $?:${BASH_REMATCH[1]}
0:456

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Nach wie vor würde ich $1 statt $* verwenden, weil man ja ein Argument prüfen will. Wenn in der zu prüfenden Variablen Whitespace sein kann, dann muss man halt gequotet übergeben. Wenn ich mehrere Argumente prüfen will, sähe das so aus:

1
2
3
4
5
6
7
8
9
$ uint () { local a; for a; do [[ "$a" == +([0-9]) ]] || return; done; }
$ uint 1; echo $?
0
$ uint 1 2; echo $?
0
$ uint 1 2 a; echo $?
1
$ uint b 1 2 a; echo $?
1

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1246

Ja, aber wäre es nicht höflicher gewesen, statt for a; lieber for a in "$@"; zu schreiben? Nicht jeder unbedarfte Leser erkennt sonst sofort, wo die übergebenen Parameter her kommen.

Antworten |