regex kérdés, vagy más megoldás?

Vizsgálatot végeznék a percre. User megadja a percet, de szeretném leellenőrizni hogy jól adta-e meg. Bonyolítja a dolgot hogy a perc ugye lehet egyjegyű, 17:5 vagy kétjegyű 17:05, de az óra szintén ugyanez. 5:22 vagy 05:22 

A feldolgozás miatt nekem kétjegyű szám kell. perc esetén gondoltam erre, de nem igazán jó. 

printf "Add meg a percet (0-59): "
read minute

regex="(^[+]?[0-9]|1[0-9]|5[0-9])\b"
if [[ ${minute} =~ ${regex} ]]; then
    if [[ ! -z ${minute} ]]; then
        minute="$(printf "%02d" $((10#${minute})))"
    fi
        echo "A perc jó: ${minute}"
else 
        echo "A perc nem jó: ${minute}"
fi

Ha itt a perc mondjuk 5, akkor az eredmény 05 lesz. Ha 05-öt írok be, akkor nem lesz jó. Nézegettem ezt is: https://regex101.com/r/dU5qB5/1
De még nem jöttem rá.

Hozzászólások

Szerkesztve: 2021. 05. 09., v – 10:51

Szerintm [0-5]?[0-9]

Szerk.: már, ha a kérdőjel azt jelenti, amire gondolok: [0-5]{,1}[0-9]

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Szerkesztve: 2021. 05. 09., v – 10:51
^([+]?[0-5]?[0-9])\b

A + jelet nem értem az elején, minek kell(het) neked…

Én eddig jutottam. Beleírtam minden ellenőrzést, ami eszembe jutott, hogy probléma lehet:

# Ha nincs parancssori paraméter, beolvasunk konzolról
# egyébként az első paraméterrel dolgozunk
if [ $# -eq 0 ] ; then
    printf "Add meg a percet (0-59): "
    read minute
else
    minute=$1
fi

# Ha nem csak számjegyeket adott meg, akkor hiba, kilépés
isnumber="^[0-9]+$"
if ! [[ $minute =~ $isnumber ]] ; then
    echo "hiba: csak számjegyeket fogadok el" >&2; exit 1
fi

# A kapott string több, mint 2 karakter, akkor csak az utolsó két karaktere kell
# esetleg itt lehet hibajelzés, nem elfogadott is
if [ ${#minute} -gt 2 ] ; then
    minute=${minute:(-2)}
fi

# Ha már van 0 prefix, akkor levesszük, mert a printf a 0 prefix miatt
# oktális értékre számít, így a 08, 09 hibás lesz.
minute=${minute#0}
# Amennyiben csak egy számjegyünk van, akkor 0 prefix megy elé
minute=$(printf %02u $minute)

# A meglévő két számjegyű érték 00-59 közé esik-e
isminute="^([0-5][0-9])\b"
if [[ ${minute} =~ ${isminute} ]]; then
    echo "siker: az érték perc tartományba esik: ${minute}"
else 
    echo "hiba: nem perc tartományba eső érték: ${minute}"
fi

Egyébként szerintem ez az eredeti regex

regex="(^[+]?[0-9]|1[0-9]|5[0-9])\b"

a következőt fogadja el: +0..+9 vagy 0..9 vagy 10..19 vagy 50..59. A 20..49 tartomány hiányzik, és a plusz jelet is csak egy számjegy elé fogadja el (de oda is minek kellene plusz jel?).
A soreleje direkt van belevéve a capture group-ba?

^[0-5]?[0-9]\:[0-5]?[0-9]$

[0-5]? => 0,1,2,3,4,5 (? = vagy nincs ott)

[0-9] => 0,1,2,3,4,5,6,8,9

tehát elfogadja azt hogy:

59:59

meg azt is hogy 9:59

vagy hogy 9:9 vagy hogy 09:09