India were restricted to 146 for seven after being sent in to bat at the Chinnaswamy Stadium, thanks to some spirited Bangladesh bowling.
Bangladesh came tantalisingly close to chasing down the total, but poor shots and three critical dismissals by skipper Mahendra Singh Dhoni eventually saw the home side scramble home by the slimmest of margins.
India’s group stage victory bolsters their chances of reaching the semi-finals, but they must now defeat Australia on Sunday to secure a place in the final four.
But defeat means that Bangladesh, who have lost all three of their Super 10 games so far, have no chance of progressing further.
Opener Tamim Iqbal top-scored for Bangladesh with 35 off 32 balls, before he was stumped by the Indian skipper just as he was looking dangerous.
The aggressive batsman put on 44 runs with Sabbir Rahman for the second wicket, but Rahman was also stumped for 26 as he looked to carry on the momentum.
Shakib Al Hasan made a quick-fire 22 off 15 before he was caught by Suresh Raina at slip off Ravichandran Ashwin.
Soumya Sarkar managed 21 as the required runs were gradually ticked off, but Indian spinners Ravindra Jadeja and Ashwin kept their cool under pressure and continued to take wickets.
With Bangladesh needing 10 runs off five balls in a gripping final over sent down by Hardik Pandya, Mushfiqur Rahim (11) smashed two consecutive fours, before holing out to Shikhar Dhawan on the mid-wicket boundary.
With two runs needed from two balls, Mahmudullah was inexplicably also caught in the deep for 18.
Incoming batsman Mustafizur Rahman had no choice but to race down the wicket, after Shuvagata Hom stabbed and missed the final ball, and was run out by Dhoni.
Confirmation of the dismissal by the TV umpire sent the crowd and the Indian team into wild celebrations.
India, with one loss and one win heading into Wednesday’s match, couldn’t afford to lose if they were to keep their dream alive of becoming the first country to win the World T20 title twice.
But their total of 146 for seven seemed below par, thanks to some gritty bowling by Bangladesh, who were looking to beat India in this format for the first time.
Al-Amin Hossain took two wickets for Bangladesh off two balls, while newcomer Shuvagata Hom claimed the critical scalp of Virat Kohli for 24.
Indian openers Dhawan (23) and Rohit Sharma (18) put on a patient 42-run partnership before both lost their wickets in the space of six balls as they tried to accelerate.
Kohli and Raina put on 50 before Hom clean bowled Kohli just as he was looking dangerous.
Al-Amin then struck, with Raina caught by Sabbir Rahman for 30, and Sarkar taking a spectacular diving catch on the boundary to claim Pandya for 15.
Dhoni battled to an unbeaten 13 runs off 12 balls.
Over 20: 145/9
Mustafizur OUT 0 (0).
Mahmudullah OUT 18 (22).
Mushfiqur OUT 11 (6).
Over 19: 136/6
Over 18: 130/6
Soumya OUT 21 (21).
Over 17: 120/5
Over 16: 113/5
Over 15: 104/5
Over 14: 99/5
Over 13: 96/5
Shakib OUT 22 (14).
Over 12: 95/4
Mortaza OUT 6 (5).
Over 11: 87/3
Over 10: 77/3
Shabbir OUT 26 (15).
Over 9: 67/2
Over 8: 56/2
Tamim OUT 35 (32).
Over 7: 53/1
Over 6: 45/1
Over 5: 29/1
Over 4: 20/1
Over 3: 12/1
Mohammad Mithun OUT 1 (3).
Over 2: 10/0
Over 1: 7/0
Over 20: India 146/7
Bangladesh require 147 runs to win.
WICKET: Ravindra Jadeja b Mustafizur Rehman 12 (8b 2×4 0x6). India 137/7 in 19.1 overs. Next batsman: Ravi Ashwin.
Over 19: India 137/6
Ravindra Jadeja hit the two fours while Dhoni also hit a boundary in Al-Amin Hossain’s over.
Over 18: India 123/6
Mustafizur Rehman gave five runs in his third over. M.S. Dhoni crossed 1000 run mark in the over.
Over 17: India 118/6
Mahmudullah gave four singles and got the wicket of Yuvraj Singh.
WICKET: Yuvraj Singh c Al-Amin Hossain b Mahmudullah 3 (6b 0x4 0x6). India 117/6 in 16.5 overs. Next batsman: Ravindra Jadeja.
Over 16: India 114/5
Al-Amin Hossain gave two runs and got the wicket of Pandya and Raina.
WICKET: Hardik Pandya c Soumya Sarkar b Al-Amin Hossain 15 (7b 2×4 1×6). India 112/5 in 15.2 overs. Next batsman: Yuvraj Singh.
WICKET: Suresh Raina c Sabbir Rahman b Al-Amin Hossain 30 (23b 1×4 2×6). India 112/4 in 15.1 overs. Next batsman: M.S. Dhoni.
Over 15: India 112/3
Shakib Al Hasan gave 13 runs in the over Pandya hit the two fours.
Over 14: India 101/3
Raina struck the boundary on the first ball and Kohli struck the six before being bowled by Shuvagta Hom. Pandya struck the second maximum in the over.
WICKET: Virat Kohli b Shuvagata Hom 24 (24b 0x4 1×6). India 95/3 in 13.4 overs. Next batsman: Hardik Pandya.
Over 13: India 84/2
Five singles taken in the over bowled by Shakib Al Hasan.
Over 12: India 79/2
The Bangladeshi captain went for six runs in his fourth over.
Over 11: India 73/2
Rain struck back to back sixes in Al-Amin Hossain’s over.
Over 10: India 59/2
Mashrafe Mortaza went for seven runs in his third over.
Over 9: India 52/2
Three runs conceded by Shuvagta Hom in the over.
Over 8: India 49/2
Indian batsmen scored four runs from Mashrafe Mortaza’s over.
Over 7: India 45/2
Shakib Al Hasan gave three singles and dismissed Shikhar Dhawan in the over.
WICKET: Shikhar Dhawan lbw Shakib Al Hasan 23 (22b 2×4 1×6). India 45/2 in 7 overs. Next batsman: Suresh Raina.
Over 6: India 42/1
Sharma and Dhawan both struck a maximum in Mustafizur Rehman’s over before the right-handed batsman was dismissed..
WICKET: Rohit Sharma c Sabbir Rahman b Mustafizur Rahman 18 (16b 1×4 1×6). India 42/1 in 6 overs. Next batsman: Virat Kohli.
Over 5: India 27/0
Bangladesh missed a run out opportunity in Shakib Al-Hasan’s over.
Over 4: India 23/0
Six runs scored from Mustafizur Rehman’s first over as Dhawan hit the four.
Over 3: India 17/0
Sharma cut Al-Amin Hossain for a four on the first ball of his over.
Over 2: India 9/0
Dhawan hit Shuvagta Hom for the first boundary of the match.
Over 1: India 5/0
Indian openers scored runs from the first over bowled by Bangladeshi captain Mashrafe Mortaza.
Openers: Rohit Sharma and Shikhar Dhawan.