India racked up a competitive 184-6 batting first, Virat Kohli unbeaten on 64 and KL Rahul hitting four sixes on his way to 50, but were put under pressure by some fierce hitting from Liton Das.
The opener blazed away in the powerplay, scoring 59 in 27 deliveries as the Tigers raced to 66 without loss after seven overs.
That placed them 17 ahead of the Duckworth-Lewis-Stern (DLS) calculations as the players headed for the pavilion and the covers came out.
For a while, it looked as though that would be the decisive factor but the umpires decided to reduce the second innings to 16 overs and got the teams back on the field despite a visibly drenched outfield.
For Bangladesh the revised target of 151 only served to dilute their hard-fought advantage, asking them to make another 85 in just nine overs.
And the effects of the greasy pitch were about to make things even worse.
Das, who had looked in complete control before the break, slipped turning for a second run off the very first ball back and needed treatment on his wrist.
A similar thing happened when play resumed, but this time he lost his footing and the results were more dramatic, as he was expertly run out by Rahul for 60 diving to make his ground.
It was a killer blow and one Bangladesh never fully recovered from. Najmul Hossain Shanto, who had been Das' silent partner at the top, launched a six before he was next to go, before Arshdeep Singh accounted for Shakib-al-Hasan and Atif Hossain.
It all came down to 20 needed off the final over, with Arshdeep closing out, and the final margin was closer than anticipated as a six and a four from Nurul Hasan ensured it went all the way to the last ball.
That was a well directed yorker, allowing Indian nerves to finally ease.
India finish their Super 12 campaign against Zimbabwe, with a semi-final place all but assured, while Bangladesh need to usurp South Africa and overturn a big run-rate deficit to sneak through.