Zimbabwe lost their last five wickets for only 16 runs as Shakib ripped through the middle and lower order of the hosts. Shakib got five wickets for 30 runs including the wickets of captain Brendan Taylor and highest scorer Regis Chakabva. Chakabva scored 54 off 51 balls. Only three players of the host team reached double digit.
Shakib has now become Bangladesh's highest wicket-taker in ODIs after dismissing Taylor. The allrounder overtook Mashrafe Mortaza's tally of 269.
Taskin Ahmed, Mohammad Saifuddin and Shoriful Islam bagged one wicket each.
Earlier, Zimbabwe won the toss and sent Bangladesh to bat first. Opener Liton Das scored his fourth ODI ton as Bangladesh scored 276 for 9 after 50 overs.
Liton steadied Bangladesh innings by making a 93-run fifth wicket stand with Mahmudullah Riyad after Bangladesh lost their first 4 wickets for only 74.
After Liton departed while Bangladesh at 207, Afif Hossain and Mehidy Hasan Miraz added a valuable 58-run stand in the seventh wicket to post a fighting scored on the board.
Afif scored 45 off 35 and Mehidy 26 off 25 while Mahmudullah scored 33.
Blessing Muzarabani removed Tamim Iqbal for a duck in the third over with no run on the board.
Off the first ball of the third over, Tamim went to cut but managed only an edge to the wicketkeeper.
Shakib Al Hasan, Mohammad Mithun and Mosaddek departed cheaply.
Luke Jongwe scalped three wickets, Muzarabani and Richard Ngarava took two each.
Liton was adjudged man of the match.