Works nicely, but bear in mind that that is essentially a placeholder - that 's/...' line is replacing the text '$table_name' with the value held in the variable '$table_name'. I'd tend to suggest that's a source of confusion later on.
I absolutely agree -- scope confusion waiting to happen.
I also fully agree with the other posters who added the suggestion to use clearly identifiable tags (I'm a big fan of double hash sign encapsulated codes like ##TABLE_NAME## and such), as well as the numerous warnings about this solution being susceptible to injection attacks.
I just figured the first step was to get the OP past the operational issue, and then start layering in the good engineering practices LOL.