He finished 23 seconds ahead of Bahrain-Merida pair, Domenico Pozzovivo and Australian Rohan Dennis, who is second in the overall classification, at the end of the 216.6km stage from Unterterzen to San Gottardo.
The group of leaders caught the remnants of the day's break with a little over five kilometres from the finish at the top of the Gotthard Pass.
Less than 3km from the finish of the climb, Bernal made his move and soloed to the victory.
“I’m really happy for the win today," Bernal said. "I won last year in the TT at the Tour of Romandie, so it’s nice to win again in Switzerland.
"It was difficult to know because you never know how well your opponents are going but I felt really good. I said to the guys and like always they did a fantastic job. I won the stage for them and it feels really nice.
“[My team-mates] were full gas and it was really hard to stay with them in the wheels. But I tried to stay calm and in the final, it was the best decision. We made a good pace and at the end, everyone went full gas.
“Dennis is the world champion in the TT. For sure tomorrow I will lose time to him. I hope to not lose too much time, but we have another mountain stage on Sunday. We will do our best and control what we can control.”
With two stages left, Bernal is 41 seconds clear of Dennis on GC with Patrick Konrad (BORA-hansgrohe) third at 1min 13sec.
The penultimate stage is a 19.2 km time trial around Goes with Dennis expected to claw back some time in his favoured event.
“It has been a very hard race and the team was really very good to put me and Domenico in the best position before Gotthard Pass," Dennis said.
"I was not feeling great but I wanted to repay my teammates for the trust they placed in me and the only way was to do my best. I haven't lost much from Bernal and tomorrow I'll try to get the jersey back."