See the description of the *${name:offset} *syntax in *man zshexpn*. Note the space between the colon and minus-sign is required to disambiguate it from the "var:-default" syntax. function lastarg() { print "${@[-1]}" print "${@: -1}" } lastarg 1 2 3 On Mon, Jul 7, 2014 at 2:06 PM, TJ Luoma wrote: > I’m trying to learn better ways of dealing with arguments given to a > function, because I am sure that I am not doing it the most efficient > way. > > For example, if I want to process a series of args, I usually use a > loop like this: > > for FOO in "$@" > do > case "$FOO" in > -t|--to) > shift > TO="$1" > shift > ;; > > -v|--verbose) > VERBOSE='yes' > shift > ;; > > -*|--*) > echo " $NAME [warning]: Don't know what to do with arg: $1" > shift > ;; > > esac > > done # for args > > That has worked OK for what I've needed to do, but now I'm trying to > create two functions which I will use in place of 'cp' and 'mv' and I > need to be able to find the _last_ argument (the destination) before I > process all the rest of the args. > > The only way that I can think of to get the last argument is to do > something like this > > LAST=`echo "$@" | awk '{print $NF}'` > > but that made me wonder if there wasn’t a better way. > > Note that this does not need to be 'portable' at all -- I will happily > use any zsh-specific features which may exist, as long as it works in > 5.0.2 (which is what comes with OS X). > > Thanks! > > TjL > -- Kurtis Rader Caretaker of the exceptional canines Junior and Hank