You're doing the $eval() backwards:
echo -a Value: $eval($+(%,readn,%nick),2)
In this, there are about 3 things you need to be aware of:
- String concatenation : $+()
- Separation of variable componants : %, readn, %nick
- Double-evaluation : $eval(<string>,2)
The first part is making up your full variable name '%readnLostShadow'.
The second part is the breaking up of '%' and 'readn'. As you're double-evaluating next, you don't wand '%readn' to be evaluated yet, thus the splitting up.
The third part is the two-pass evaluation. The first pass does this (where '%nick = LostShadow'):
$+(%, readn, %nick) -> %readnLostShadow
The second pass then evaluates the resultant string.
Throughout this, you can use either %nick or $1. Using $1 will probably make it easier/faster however.
Here's a question for you however.. You're using 'set -u30'. As you are zeroing out the %readn<nick> variable every time you execute it, is there really any reason for the variable to stick around for 30 seconds? I'd suggest you use '/var' instead, a localized variable which unsets once complete.