• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af marlar | 19.10.2010 11:35

Teste med regex direkte i bash? [LØST]

Software
Jeg har et lille script hvor man skal indtaste en firecifret kode. Denne kode validerer jeg så med:


Code=$(zenity --title="Kodetest" --text="Indtast den firecifrede kode" --entry)

CodeOk=$(sh -c "echo -n $Code | egrep '^[[:digit:]]{4}\$'")


Det virker perfekt, men jeg tænker bare på om jeg kunne gøre det samme direkte i bash i stedet for at starte en subshell med sh -c kommandoen?

Ps. hvorfor fremhæves de to linjer forskelligt i < code > blokken ?
  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer8

# 1

15 år 3 måneder siden

Permalink

Indsendt af mrbrown79 den 19. oktober 2010 kl. 12:24

Permalink

Noget i stil med følgende måske


echo $Code | egrep --quiet "^[0-9]{4}" && echo "DO WHATEVER SHOULD BE DONE" || echo "CODE NOT OK"
  • Log ind eller opret dig for at tilføje kommentarer

# 2

15 år 3 måneder siden

Permalink

Indsendt af marlar den 19. oktober 2010 kl. 12:30

Permalink

Joh, men jeg skal arbejde

Joh, men jeg skal arbejde videre med testresultatet. Altså:


if [ ! $CodeOk ]; then
zenity --title="Kodetest" --text="Koden skal være på præcis 4 cifre." --info
exit
fi
  • Log ind eller opret dig for at tilføje kommentarer

# 3

15 år 3 måneder siden

Permalink

Indsendt af mrbrown79 den 19. oktober 2010 kl. 13:13

In reply to Joh, men jeg skal arbejde by marlar

Permalink

Så kan du

Enten udskifte echo-kommandoen med noget, der sætter den variabel som du vil arbejde videre med. Eller - hvis muligt i din struktur - indsætte din kode direkte istedet for echo.... a'la:

echo $Code | egrep --quiet "^[0-9]{4}" || (zenity --title="Kodetest" --text="Koden skal være på præcis 4 cifre." --info && exit)
  • Log ind eller opret dig for at tilføje kommentarer

# 4

15 år 3 måneder siden

Permalink

Indsendt af marlar den 19. oktober 2010 kl. 13:56

Permalink

Dit forslag i #3 er en god

Dit forslag i #3 er en god ide og vil virke fint.

I øvrigt er det mere læseligt med [0-9] end [[:digit:]]. Jeg er vant til perl komtatible regex, her skriver man simpelthen \d hvilket er meget mere kompakt og læseligt end [[:digit:]]. Det kan man faktisk også med grep -P, men det er ikke officielt understøttet.
  • Log ind eller opret dig for at tilføje kommentarer

# 5

15 år 3 måneder siden

Permalink

Indsendt af marlar den 19. oktober 2010 kl. 14:10

Permalink

Hmm, det starter fint zenity

Hmm, det starter fint zenity med beskeden om forkert kode, men exit-funktionen virker ikke. Jeg tror der bliver startet en subshell pga. parantesen, og det er så kun dén subshell som exit'er.
  • Log ind eller opret dig for at tilføje kommentarer

# 6

15 år 3 måneder siden

Permalink

Indsendt af marlar den 19. oktober 2010 kl. 14:15

Permalink

Nå, nu fandt jeg så ud af

Nå, nu fandt jeg så ud af at sh -c slet ikke er nødvendig!

Dette virker perfekt:
CodeOk=$(echo $Code | egrep '^[0-9]{4}$')
  • Log ind eller opret dig for at tilføje kommentarer

# 7

15 år 3 måneder siden

Permalink

Indsendt af jakob lund den 19. oktober 2010 kl. 17:11

Permalink

=~ operator

Du kan også gå uden om grep med en =~ operator:


if [[ "$Code" =~ ^[0-9]{4}$ ]]
then
echo "god firecifret kode"
else
echo "fejl"
fi

  • Log ind eller opret dig for at tilføje kommentarer

# 8

15 år 3 måneder siden

Permalink

Indsendt af marlar den 19. oktober 2010 kl. 20:45

Permalink

Super, det var præcis

Super, det var præcis sådan en løsning jeg søgte, men jeg kendte ikke tilde-operatoren.

Et ekstra spørgsmål: hvordan negerer man udtrykket så det er sandt hvis det ikke matcher? Altså hvis man ikke ønsker en else-del, men kun en fejlmelding og en exit hvis koden ikke matcher?
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

GRUB 2.14 introducerer understøttelse af EROFS, forbedringer til Btrfs og LVM 0
KDE Plasma 6.6 tilføjer en funktion, som brugerne har spurgt efter i evigheder 0
Linux i København 12.01.2026: Open source i det offentlige 0
Dansk distro Omarchy 0
KDE overgår indsamlingsmålet for 2025 med rekordstor støtte fra lokalsamfundet 0

Seneste aktivitet

Debian 13.3.0 7
BigLinux 1
E-mail blues 6
Linux Mint 22.3 - hvornår opdatere? 10
Canon-printer: Jeg savner "Ink-Toner Level"-meddelelse 10
billede af nuværende installation 2
mapper 4
LinuxIn live 9
Linux Debian på ekstern HD 4
usb disk *LØST* 2
Pacman kunne erstattes af en anden Rust baseret mulighed 1
Epson skanner software 8
Debian 1
Printer Epson ET-2865 problem 8
Winboat 4
Nu kan man skrive private beskeder 14
Mint på imac 2009 34
Firefox AI 7
Kunstig inteligens 6
Kopiering til min Samsung telefon 9

© 2026 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !