The visitors improved following a slow start and took the lead through Ben Close just before the break.
There were chances to add to the scoring at both ends of the pitch in the second half, but a defensive mix-up allowed Brett Pitman to seal the points for the Blues.
Kenny Jackett made one enforced change from the side that beat Scunthorpe on home soil the previous week.
Viv Solomon-Otabor’s calf injury meant that Gareth Evans returned to the starting line-up, with Jamal Lowe switching to the left.
It was the struggling hosts that made the brighter start and a low delivery from Fejiri Okenabirhie was just of reach for a stretching Shaun Whalley.
Steve Arnold had to tear from his line at the other end to stop Lowe racing onto a superb diagonal pass from Tom Naylor.
Pompey were struggling to find any fluency, however, and a weak effort from Okenabirhie was comfortably dealt with by former Shrews stopper Craig MacGillivray.
The keeper had to do even better on 16 minutes, though, getting down quickly to push Whalley’s effort to safety.
Shrewsbury’s forward then had an effort that was heading for the net until Nathan Thompson’s deflection diverted the ball wide.
And it took a fine last-gasp challenge by Lee Brown inside the box to prevent Ollie Norburn getting a shot away.
Scott Golbourne’s free-kick was then flicked on for James Bolton, who sent a header looping onto the roof of the net.
But the Blues picked up as the half progressed and Arnold did well to deny Evans after the ball had been squared to him by Close.
It was Close who then sent a shot wide after playing a one-two with Omar Bogle, while Matt Clarke could not divert Brown’s corner on target at the near post.
Pompey did make their pressure count before the break, as Brown’s angled effort was parried away by Arnold and CLOSE drilled the ball home through a sea of bodies.
Shrewsbury Town 0
The hosts tried to hit back following the restart and Christian Burgess dived in to divert Greg Docherty’s effort behind.
There were a few sighs of relief when the same player then went down inside the box following a challenge by Thompson.
Referee Ollie Yates blew his whistle, but the challenge had taken place just outside the area and Okenabirhie’s free-kick was dealt with.
Jackett made a switch on 55 minutes, with Bogle – who had angered the home faithful with a challenge on Golbourne that earned him a booking – replaced by Oli Hawkins.
And the newcomer almost doubled the visitors’ lead after meeting Brown’s low delivery, only for the ball to hit Omar Beckles and loop against the crossbar.
Hawkins had another great opportunity on 71 minutes when he connected with a cross from Brown, but Arnold made a great save down to his left to deny the striker.
Shrewsbury soon had a chance of their own after Whalley’s mazy run had been crudely brought to a halt by Burgess on the edge of the box.
Norburn cleverly kept his effort low and sent it through the wall, but an unsighted MacGillivray was able to fumble the ball away.
And Pompey soon went up the other end to give themselves a cushion – although the Shrews gave them a helping hand.
Arnold’s clearance cannoned against team-mate Beckles and Hawkins picked up the loose ball, squaring it for PITMAN to slot home.
Shrewsbury were soon dealt a further blow when Arnold was forced to limp off, with Jonathan Mitchell replacing him between the sticks.
Six minutes of stoppage-time meant that the hosts’ hopes of an unlikely comeback were raised, but Pompey comfortably saw out the closing stages to move up to third spot in the League One table.
Shrewsbury (3-5-2): Arnold (Mitchell 84); Williams, Waterfall, Beckles; Bolton (Campbell 72), Norburn (c), Grant (Laurent 77), Docherty, Golbourne; Whalley, Okenabirhie
Subs not used: Sadler, Edwards, Holloway, Payne
Pompey (4-2-3-1): MacGillivray; Thompson, Burgess, Clarke, Brown; Naylor, Close; Evans (Walkes 89), Pitman (c), Lowe; Bogle (Hawkins 55)
Goals: Close 40, Pitman 79
Booked: Bogle, Naylor, Close, Burgess, Brown
Subs not used: Bass, Haunstrup, May, Isgrove, Vaughan
Referee: Ollie Yates
Attendance: 8,028 (1,172 Pompey fans)