Opting to bat, Mehidy Hasan Miraz (100 not out) slammed his maiden ODI century and forged a 148-run stand with Mahmudullah Riyadh (77) to lift Bangladesh to a challenging total after being reduced to 69 for six in 19 overs.
For India, Washington Sundar (3/37) was the most successful bowler, while Mohammed Siraj (2/73) and Umran Malik (2/58) also snapped two wickets each.
Chasing, Shreyas Iyer made 82 while Axar Patel scored a run-a-ball 56 but India fell short as they were restricted to 266 for nine in 50 overs.
Skipper Rohit Sharma, who split his webbing while fielding, remained unbeaten on 51 off 28 balls.
Ebadot Hossain (3/45) picked up three wickets while Shakib Al Hasan (2/39) and Miraz (2/46) scalped two wickets each.
Bangladesh: 271 for 7 in 50 overs (Mehidy Hasan Miraz 100 not out, Mahmudullah 77; Washington Sundar 3/37).
India: 266 for 9 in 50 overs (Shreyas Iyer 82, Axar Patel 56, Rohit Sharma 51 not out; Ebadat Hossain 3/45).