Bangladesh closed the fourth day's play at 201-5 in their second innings, an overall lead of 266 with five wickets in hand and a day's play remaining.
Left-arm spinner Shakib finished with 5-80 as Zimbabwe, who resumed their first innings at 331-5, folded up for 368 before lunch to hand the hosts a lead of 65 runs
Hamilton Masakadza added just four runs to his overnight score of 154 before he was bowled by Shakib, who then dismissed Malcolm Waller to complete his thirteenth five-wicket haul in Tests.
Shakib, who made 137 in the first innings, became only the fifth player to score a century and take five wickets in an innings in the same Test more than once.
Regis Chakabva took his overnight score of 101, his maiden Test century, before he was the last batsman dismissed.
In Bangladesh's second innings, Mohammad Mahmudullah returned unbeaten on 63 and Mominul Haque made 54. Mominul set a new Bangladesh record by completing 1,000 Test runs in 21 innings, surpassing teammate Tamim Iqbal, who did it in 29 innings.
Waller dismissed Shakib and skipper Mushfiqur Rahim off consecutive balls to end the day with figures of 4-48.
Like Sports on Facebook, follow @ETribuneSports on Twitter to stay informed and join in the conversation.
COMMENTS
Comments are moderated and generally will be posted if they are on-topic and not abusive.
For more information, please see our Comments FAQ