Garcia doubled in two runs in the first, singled in the third and connected for a solo drive in the sixth. Omar Narvaez added a two-run homer in the eighth off Kevin McCarthy and Joakim Soria pitched the ninth for his 14th save in 17 chances.
ht#mce_temp_url# (4-10) pitched five-hit ball into the seventh inning as the White Sox earned their second straight win after a six-game slide. They finished with 14 hits against the AL Central-worst Royals.
Whit Merrifield had two hits and scored two runs for Kansas City, which has dropped 12 of 13. Brad Keller (2-4) was tagged for five runs and seven hits in 2 2/3 innings.
Jorge Bonifacio chased Shields with a two-out, two-run double in the seventh. Lucas Duda scored on third baseman Yolmer Sanchez's error in the eighth and Merrifield added an RBI single, pulling Kansas City within one.
But Charlie Tilson made a nice running catch on Bonifacio's deep fly ball to center, ending the inning. Soria then worked a perfect ninth.
The White Sox opened a 5-2 lead with two in the third. Narvaez and Ryan LaMarre each had an RBI single.
Abreu and Garcia went deep in the sixth. Abreu hit a solo shot off Heath Fillmyer for his 13th of the season. It was his first homer since June 27.
Garcia's fourth homer came against Tim Hill.