At stumps, Ravichandran Ashwin (2) and Harbhajan Singh (7) were holding fort for India when rain came pouring down and washed off the final session of play on a stop-start day.
Starting the second session after a one-and-a-half-hour delay due to rain during lunch time, India lost Vijay 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.
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.
India 1st innings
M Vijay lbw b Shakib Al Hasan 150
S Dhawan c & b Shakib Al Hasan 173
RG Sharma b Shakib Al Hasan 6
V Kohli* b Jubair Hossain 14
AM Rahane b Shakib Al Hasan 98
WP Saha† b Jubair Hossain 6
R Ashwin not out 2
Harbhajan Singh 7
Extras 6
Total: 462/6