Bash and regex problem : check for tokens entered into a Coke vending machine

Posted by Michael Mao on Stack Overflow See other posts from Stack Overflow or by Michael Mao
Published on 2010-04-07T05:11:19Z Indexed on 2010/04/07 5:13 UTC
Read the original article Hit count: 363

Filed under:
|
|

Hi all:

Here is a "challenge question" I've got from Linux system programming lecture.

Any of the following strings will give you a Coke if you kick:

L = { aaaa, aab, aba, baa, bb, aaaa"a", aaaa"b", aab"a", … ab"b"a, ba"b"a, ab"bbbbbb"a, ... }

The letters shown in wrapped double quotes indicate coins that would have fallen through (but those strings are still part of the language in this example). Exercise (a bit hard) show this is the language of a regular expression

And this is what I've got so far :

#!/usr/bin/bash
echo "A bottle of Coke costs you 40 cents"
echo -e "Please enter tokens (a = 10 cents, b = 20 cents) in a
sequence like 'abba' :\c"
read tokens

#if [ $tokens = aaaa ]||[ $tokens = aab ]||[ $tokens = bb ]
#then
#       echo "Good! now a coke is yours!"
#else    echo "Thanks for your money, byebye!"

if [[ $token =~ 'aaaa|aab|bb' ]]
then
        echo "Good! now a coke is yours!"
else    echo "Thanks for your money, byebye!"
fi

Sadly it doesn't work... always outputs "Thanks for your money, byebye!" I believe something is wrong with syntax... We didn't provided with any good reference book and the only instruction from the professor was to consult "anything you find useful online" and "research the problem yourself" :(

I know how could I do it in any programming language such as Java, but get it done with bash script + regex seems not "a bit hard" but in fact "too hard" for anyone with little knowledge on something advanced as "lookahead"(is this the terminology ?)

I don't know if there is a way to express the following concept in the language of regex:

Valid entry would consist of exactly one of the three components : aaaa, aab and bb, regardless of order, followed by an arbitrary sequence of a or b's

So this is what is should be like :

(a{4}Ua{2}bUb{2})(aUb)*

where the content in first braces is order irrelevant.

Thanks a lot in advance for any hints and/or tips :)

© Stack Overflow or respective owner

Related posts about bash

Related posts about regex