简体   繁体   中英

Why does this code throw an error when passed to `zsh -n` but not to `zsh`?

I'm trying in this example to copy all values from one associative array to another. I'm checking my code against syntax errors using zsh -n but this one throws a test:12: bar: assignment to invalid subscript range .

#!/usr/bin/env zsh
typeset -A foo bar
foo=(
    Adama   "Commander"
    Tigh    "Executive Officer"
    Roslin  "President"
)
bar=()

for i in ${(k)foo}; do
    # "rubbish"
    bar[$i]=$foo[$i]
done

If I uncomment the # "rubbish line, zsh -n stops complaining. Is there something wrong with my code or with zsh -n ?

You can see what's going on by adding the debug mode ( -x )

As the non_exec mode ( -n ) doesn't execute nothing, it doesn't execute the typeset so bar is not an "associative array", and the assignment is not valid.

I see that the presence of the "rubbish" line (or other line looking like a command) prevents the program entering in the 'for' loop.

Zsh mailing list: zsh -n doesn't grok associate array indexes? (Jan 2011)

I tried with zsh 4.3.12 and the behaviour is more consistent, with -n the program never enters the 'for' loop.

For a smaller program with no loop:

#!/usr/bin/env zsh
typeset -A bar
bar[test]=testons
echo $bar

zsh 4.3.10 and 4.3.12 will both execute the program the same way, but zsh-4.3.10 -n will wrongly report an error (assignment to invalid subscript range) when zsh-4.3.12 -n will not.

As a conclusion, use zsh 4.3.12 (or newer, i discover that ZSH 5 is available)
News about zsh (Including "news" from 1997!)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM