Umesh Yadav and Ravichandran Ashwin claimed four wickets apiece as India bowled Bangladesh out for 227 on the first day of the second Test in Dhaka.
Mominul Haque top-scored with 84 but Bangladesh lost wickets at regular intervals to end their innings about an hour before stumps after electing to bat first.
India reached 19-0 before bad light forced an early end to the opening day, with six overs still to be played.
Stand-in India skipper KL Rahul was batting on three with Shubman Gill 14* at stumps.
Rahul was given out lbw on three off Shakib in the final over of the day, but the decision was reversed after review.
Umesh earlier picked up 25-4 and Ashwin grabbed 71-4 as India stopped the hosts from building a significant partnership, despite several batsmen getting decent starts.
Mushfiqur Rahim (26), Liton Das (25) and Najmul Hossain (24) were all unable to lend Mominul an extended spell of support.
Mominul, playing his first match in the series, departed as the ninth wicket when he nicked Ashwin behind the stumps.
The left-hander hit 12 fours and a six to make his 16th Test fifty, also his first in the last seven Tests.
Ashwin ended the Bangladesh innings two balls later, with last man Khaled Ahmed giving a catch to Jaydev Unadkat at deep mid-wicket.
Fast bowler Unadkat, returning to Test cricket for the first time since his unremarkable 2010 debut against South Africa, impressed in the opening two sessions before finishing with 2-50.
Bangladesh had scored 184-5 at the tea break and crumbled in the final session when Umesh bowled an incisive spell to claim three successive wickets.
India won the first Test by 188 runs but are again without injured skipper Rohit Sharma, who was replaced by Rahul.
The visitors dropped left-arm spinner Kuldeep Yadav – who was named Man of the Match in the first Test for his eight wickets – and brought in paceman Unadkat.
Bangladesh made two changes, bringing in Taskin Ahmed for the injured Ebadot Hossain and Mominul for Yasir Ali.
© Agence France-Presse