Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: how do I get the last argument from a list of arguments?

On Jul 7,  5:06pm, 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.

If the arguments are defined in a fairly regular way, zparseopts is
probably the fastest method.

E.g. your "for FOO" loop becomes something like:

    local -A opts
    zparseopts -A opts -D -E -M t:=-to -to: v=-verbose -verbose

    while [[ $1 = -* ]]
	echo " $NAME [warning]: Don't know what to do with arg: $1"

    # You can skip this part and use $opts[] directly, but:
    local TO=$opts[--to] VERBOSE=${opts[--verbose]+yes}

With the -E -D -K flags you can call zparseopts multiple times if you
want to (-E means skip over unspecified options, -D means remove the
specified ones, and -K means to keep the results of previous calls).

} 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.

See Kurtis' reply regarding how to access arrays from the tail end.
However, GNU cp/mv both take a --target= option so the directory name
needn't be the last argument.  So you could do something like

    zparseopts -E -D -A opts --target:
    if [[ -z $opts[--target] ]]
      shift -p

That "shift -p" means to "pop" the last argument, in the "cp" example
leaving $@ holding only the file names you are interested in copying.

Messages sorted by: Reverse Date, Date, Thread, Author