Mustafizur Rahman chipped in with 3-19, helping Bangladesh out Zimbabwe for 138 runs in 19.4 overs.
Replying to a modest 143, Zimbabwe lost opener Brian Bennett for a duck in the first over and was quickly reduced to 57-4.
But they remained in contention after a middle-order rally, with Johnathan Campbell and Ryan Burl putting on a 35-run stand.
Mustafizur forced Burl to give a catch to Soumya Sarkar after making 19 runs, and Shakib took the wicket of Campbell for 31 to put Bangladesh on top.
Wellington Masakadza hit 19 runs from eight balls to take Zimbabwe close, only to go off the strike in the final over when Zimbabwe needed 14.
Shakib Al Hasan, who was playing his first T20I in nearly a year, dismissed Blessing Muzarabani and Richard Ngarava in the final over to wrap up the Zimbabwe innings.
Sent into bat after Zimbabwe won the toss, Bangladesh got off to a flying start when openers Tanzid Hasan Tamim and Soumya made a 101-run stand for the first wicket.
Luke Jongwe dismissed Tanzid for 52 off 37 balls to break the opening partnership and then Soumya fell in the same over for 41.
The hosts lost their remaining eight wickets for just 35 runs to be bowled out for the first time in the series.
Zimbabwe captain Sikandar Raza sent back Towhid Hridoy for 12 before Bennett struck twice in the same over, dismissing Shakib for one.
Bangladesh had already clinched the series after sweeping the first three matches.
Zimbabwe wrapped up their Bangladesh tour with the fifth and final match of the series in Dhaka on Sunday.