Shakib's 2 for 20 with the ball had restricted Zimbabwe to 168 for five, but his 65 from 40 deliveries failed to bring a morale-boosting win when Bangladesh lost five wickets for 23 runs in 19 deliveries.
Although captain Mushfiqur Rahim's 28-run blitz threatened to take his side over the line, he fell to the first ball of the final over and Bangladesh finished on 162 for eight.
Hamilton Masakadza's free-flowing half-century had anchored Zimbabwe's innings, which also enjoyed contributions from Brendan Taylor at the top of the innings and Malcolm Waller at the end.
Masakadza hit 59 from 48 balls and was well supported by Taylor in a 74-run stand for the second wicket, which ended when the captain holed out for 40.
More From This Section
Zimbabwe's total did not look as if it would be enough when Shakib put on 118 for the second wicket with Shamsur Rahman, who made 53 in his first match of the tour.
However Prosper Utseya changed the game when he got rid of both batsmen in the same over, before two run-outs in quick succession gave Bangladesh a familiar sinking feeling.