Not sure I understand your question.
If you are saying you want all calls to the base domain address (
http://www.example.com) to go to index.php and everything else (like:
http://www.example.com/someproduct/) to redirect to shop.php then...
You don't need a rule for the base domain calls.
The easiest way to handle the other calls is to make sure all urls end with the trailing slash and test for that.
Like this:
RewriteRule ^/([^/]+)/ shop.php
In other words, give me everything that is not a slash, capture it in the parentheses, followed by a slash.
If you need to you can then pass the captured text on to your program to use as you wish. If you have no need for the captured text, leave the parentheses off, but it hurts nothing to keep them.
So, a call to
http://www.example.com/blue-widgets/
Would be redirected to shop.com
If you want to pass the text along with the redirect, do this.
RewriteRule ^/([^/]+)/ shop.php?product=$1
This would redirect to shop.php and pass a $_GET variable called "product" with a value of "blue-widgets".
Also, the dot character is a metacharacter in regex. So if you need to test for a literal dot, you must escape it (like this: \.)