The Marlins started lefty Justin Nicolino, who scattered six hits and a walk in his five-inning start. Nicolino struck out three and threw 41 of his 67 pitches for strikes. He is slated to begin the season in high Class A.
Jon Rauch, Steve Cishek and Mike Dunn followed with scoreless relief appearances for the Marlins.
Lynn retired the final 14 batters he faced in his first six-inning start of the spring. He allowed singles to Juan Pierre and Justin Ruggiano -- Pierre's was a bunt to lead off the game -- but never allowed Miami to advance a runner past second. Of Lynn's 78 pitches, 50 were strikes. He struck out five and didn't walk a batter.
Giancarlo Stanton had the Marlins' only other hit, a single in the seventh.
The only run of the game scored in the first, when Jon Jay doubled and then scored on Matt Holliday's single to center. Jay entered the game having reached base safely in eight of his previous nine plate appearances. He finished Thursday's game 2-for-3.
Holliday also finished with a multi-hit game, and has reached base at least twice in each of his last four games.
Relievers Edward Mujica, Trevor Rosenthal and Mitchell Boggs preserved the shutout for the Cardinals, as each pitched an inning. St. Louis, which has won four straight, had one previous shutout this spring.
Up next: The Marlins will play an exhibition game against their Triple-A affiliate, the New Orleans Zephyrs, in New Orleans on Saturday before opening the regular season in Washington on Monday. Left-hander Wade LeBlanc, the rotation's third starter, will take the mound for Saturday's 2 p.m. ET start. Left-hander Brad Hand will start for the Zephyrs. The game can be followed live on Gameday.
Jenifer Langosch is a reporter for MLB.com. Read her blog, By Gosh, It's Langosch, and follow her on Twitter @LangoschMLB. This story was not subject to the approval of Major League Baseball or its clubs.