Starting the session after a one-and-a-half-hour delayed start due to rain during lunch time, India lost Murali Vijay (150) as Shakib (4-105), who had already taken two wickets in the first session, got the opener lbw to break a 114-run fourth-wicket partnership.
Touching the 150-run mark, Vijay missed a sweep shot that hit him on the back pad and even though the point of impact looked outside the off stump, umpire Kumar Dharmasena raised the dreaded finger.
Leg-spinner Jubair Hossian (2-113) also joined forces to clean up Wriddhiman Saha (6) with a well-disguised googly, which the wicketkeeper batsman was unable to read while going for an expansive drive.
Shakib continued his wicket-taking run as his arm ball denied Ajinkya Rahane (98) his fourth Test century.
With a clear intent to push the scoring rate, Rahane went for an aggressive pull shot but the ball crashed on to the off stump.
Ravichandran Ashwin (2 not out) and Harbhajan Singh 7 not out) then tried to stitch up a partnership but rain came pouring down once again and the players rushed back to the pavilion.
Earlier, starting on 239 for no loss after the second day's play was lost due to rain, India moved on cautiously with Vijay reaching his sixth Test ton in the eighth over of the day but the Shakib-led spin attack had other ideas.
With play starting half-an-hour early to cover up for lost time, Shakib struck with his left-arm spin to send Shikhar Dhawan (173) back to the pavilion in the 68th over of the innings.