ubuntuusers.de

Merkwürdige Locale bei bash

Status: Ungelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1449

Danke. Das ist ein wichtiger Satz. Man sollte ihn fett rot schreiben und dreimal unterstreichen.

Ja, dann sollte man wohl doch "hard coden" ala:

$ AZ=""; for i in {A..Z}; do AZ+=$i; done
$ isVAR() { [[ ${1^^} =~ ^[${AZ}_][${AZ}_0-9]*$ ]];}
$ isVAR o7 ; echo $?
0
$ isVAR ö7 ; echo $?
1
$ 

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4773

Wohnort: Berlin

@Shiro: Eine Alternative für die erste Zeile:

1
AZ=$(printf %c {A..Z})

@kB: Python's reguläre Ausdrücke matchen bei [A-Z] auch nur die ASCII-Zeichen, unabhängig von der eingestellten locale. Nachprüfbar mit folgendem Programm:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
import re
import sys
from locale import LC_ALL, setlocale


def main():
    setlocale(LC_ALL, "")
    characters = "".join(
        filter(
            re.compile(r"[A-Z]").fullmatch,
            map(chr, range(1, sys.maxunicode + 1)),
        )
    )
    print(characters)


if __name__ == "__main__":
    main()

Das gibt immer ABCDEFGHIJKLMNOPQRSTUVWXYZ aus.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2147

Wohnort: Gelsenkirchen

kB schrieb:

Mein Problem: Meine Funktion funktioniert wie gewünscht, wenn ich ihrem Aufruf ein LANG= voranstelle. Das will ich natürlich nicht bei jedem Aufruf machen, sondern lieber in die Definition der Funktion aufnehmen. Wie mache ich das?

Was spricht denn gegen diese Lösung?

1
isVAR() { local LANG=C; [[ ${1^^} =~ ^[A-Z_][A-Z_0-9]*$ ]] }

EDIT: Sorry, ich hatte die bereits gepostete Lösung überlesen...

Antworten |