You're doing the $eval() backwards:

Code:
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'):

Code:
$+(%, 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.