There are many problems in the code. Here is one way to make an inner loop.
set obs 5 gen var1 = 1 gen var2 = 2 gen var3 = "c" gen z = 35 ds local masterlist "var1 var2" local keeplist = "" foreach i of local masterlist { capture confirm variable `i' if !_rc { local keeplist "`keeplist' `i'" } } keep `keeplist'
The key part is that you cannot foreach i of varlist phantomvar , as Stata will check for the presence and error. Similarly, a local name in special quotation marks will evaluate it, but you are trying to override it. You can find set trace on useful feature when debugging.
This is somewhat better code:
unab allvars: _all local masterlist "var1 var2 phantomvar" local keeplist: list allvars & masterlist keep `keeplist'
source share