Note that if you construct a string with the content "colors.green", that's not the same thing as referring to the variable with the name of "colors.green".
Instead of:
"colors."..io.read()
… you could use:
colors[io.read()]
(Bear in mind the lack of quotation marks is fully intentional.)
Without going in to too much detail as to why that works, suffice to say that in most cases getting users to type in variables isn't such an easy option, and is very seldom a "good" option. For example, in this case if the user doesn't type the name of a valid
colours API colour it'll crash rather messily, so you're really better off storing what they type in a variable, checking if it's valid, then only actually going ahead with the text colour change if it is.
Another point, if your monitor is connected to the back of your computer via a wired modem, then the
modem will be assigned the name of "back" and the monitor will be named something like eg "monitor_0". The actual name appears on-screen whenever you activate / de-activate the modem (by right-clicking it).