bash, zsh : declare [*] (oh my)
bash, zsh
Solution
Only Bash has `declare`. The kshes and zsh have `typeset`. That code is nonsensical in all of them, and since shells disagree about the parsing of the arguments to declaration commands like `declare` and `typeset` (with Bash in particular, `-a` alters parsing in a specific way), it's going to do a different unpredictable, potentially dangerous thing in each.
Specifically how Bash is interpreting this - from the manpage:
declare -a name[subscript] is also accepted; the subscript is ignored.
So since it's unquoted - if there's a file in the current directory named `THIS*` then Bash would throw an illegal name error due to the pathname expansion. Otherwise it will just create an empty array named "THIS".
What `[*]` means depends upon context. Unquoted in an ordinary command evaluation context, it's a character class matching only literal asterisks. If used in a parameter expansion following an array name, it expands all elements of the array to a single word separated by the first character of IFS.
`declare` in bash declares variables, returns their values, sets attributes, and affects function scope. See: http://wiki.bash-hackers.org/commands/builtin/declare
edit: Given the example that's now in the question, in bash the behavior is as described above. The `[*]` should be deleted from the `declare`. That code has a number of other issues such as attempting to put arguments into strings, using all-caps variable names, and using `[` instead of `[[` in a script that's clearly not intended to run on a minimal POSIX sh.
Problem
I'm working with a bash script that has the following syntax ``` $ declare -a THIS[*] ``` This seems to be illegal in zsh (I get a "no matches found: THIS[*]" error). Can anyone help me translate this to zsh? Also - what does the `[*]` syntax mean? (I know we're declaring an array, but why the [*]?) update To provide an example of where the code is used, and explain how it is valid - I've copied a few lines from Eric Engstrom's post on password free ssh ``` declare -a SSSHA_KEYS[*] # --- PARSE ARGS --- # sssha_parse_args() { local OPTIND=1 while getopts "xe:k:t:" OPT; do #echo "$OPT $OPTARG $OPTIND" case $OPT in t) SSSHA_ARGS="-t $OPTARG" ;; e) SSSHA_ENV="$OPTARG" ;; k) [ -f "${OPTARG}" ] && SSSHA_KEYS[${#SSSHA_KEYS[*]}]="$OPTARG" ;; x) SSSHA_STOP_ON_EXIT=$OPT esac done shift $(($OPTIND - 1)) # set default key, if none specified if [ -z "${SSSHA_KEYS[*]}" ]; then for key in $HOME/.ssh/id_[rd]sa; do [ -f "$key" ] && SSSHA_KEYS[${#SSSHA_KEYS[*]}]="$key" done fi } ``` I believe the `[*]` is being used as some kind of dynamic iterator (as we don't know how many items it will have later). I'd just like to know of the equivalent declaration in zsh!