Woeful England all but out of World Cup after 100-run hammering by India
Chasing a tricky 230 for victory in Lucknow, England collapsed to 129 all out in 34.5 overs to suffer their fifth defeat in six matches and leave their title defence at the mercy of a mathematical miracle.
The hosts have six wins in as many games and are virtually assured of a semi-final place.
Skipper Rohit Sharma led the charge with 87 as India posted 229-9, a total that looked below par but proved enough for a struggling England side on a sluggish pitch.
"It was a great performance and we would take that win any day," said man-of-the-match Rohit.
Shami returned figures of 4-22 while fellow quick Jasprit Bumrah took three wickets to wrap up the match as fireworks lit up the sky.
England had a disastrous start and fell to 52-5 after Bumrah took wickets on successive ball to be on a hat-trick and Shami joined forces to grab two more.
Bumrah sent back Dawid Malan, for 16, and Joe Root, for nought, but Jonny Bairstow played out the hat-trick ball.
England soon lost Ben Stokes, bowled by Shami, to raise India's hopes of defending the total he then brought the house down when he bowled Bairstow for 14 as 46,000 fans, largely all Indian in blue jerseys, roared.
Wickets kept tumbling and skipper Jos Buttler was bowled by Kuldeep for 10, and Shami sent Moeen Ali packing for 15 and the end was near.
Kohli duck
Earlier England left-arm quick David Willey returned figures of 3-45, including the prized wicket of Virat Kohli for a nine-ball duck, after they elected to bowl.
The unbeaten hosts lost three early wickets, including two to Chris Woakes, to slip to 40-3 before Rohit steadied the innings and built a 91-run stand with KL Rahul, who made 39.
Rohit survived a reprieve on 33 when he was given out lbw but the opener reviewed the decision in his favour with tracking showing the ball would have missed the leg stump.
Rohit reached his second fifty of the tournament -- he also hit a century against Afghanistan - to the noisy delight of the nearly-packed 50,000-seater stadium.
The captain and Rahul, who was returning to his IPL home ground where he suffered a serious injury earlier this year, kept the score ticking before Willey broke the stand with Rahul's wicket.
"I know I have got the experience to bat situations, not just going out there and playing my shots all the time," added Rohit.
"It was about using that experience to help the team and it was my job there to take the game as deep as possible. I still felt we were about 20 runs short even after that."
Rohit kept up the fight but fell to leg-spinner Adil Rashid after he holed out to deep mid-wicket where Liam Livingstone took a low catch.
Kohli, who endured his 16th duck in ODIs, remains one century away from equalling all-time great Sachin Tendulkar's record of 49 hundreds in the 50-over format.
Suryakumar Yadav made a fighting 49 before becoming Willey's third wicket but the tail played out the full 50 overs.