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?
- X-seq: zsh-users 18932
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: TJ Luoma <luomat@xxxxxxxxx>, Zsh-Users List <zsh-users@xxxxxxx>
- Subject: Re: how do I get the last argument from a list of arguments?
- Date: Mon, 07 Jul 2014 15:06:25 -0700
- In-reply-to: <CADjGqHuALx7Ue3Ei3s7XvT_pHWxECo2rt=BNegPO5Fwcuge2LQ@mail.gmail.com>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <CADjGqHuALx7Ue3Ei3s7XvT_pHWxECo2rt=BNegPO5Fwcuge2LQ@mail.gmail.com>
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 = -* ]]
do
echo " $NAME [warning]: Don't know what to do with arg: $1"
shift
done
# 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] ]]
then
opts[--target]=$@[-1]
shift -p
fi
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