James Shields threw a four-hitter and Alex Gordon homered as the Kansas City Royals won their sixth straight, beating the San Francisco Giants 5-0 on Saturday night.