As I've mentioned before, I have been using zsh forever but feel like I missed out on learning about 97% of what it can do. For example, today I learned about zparseopts. (Feel free to mock.) I took a look through the `man` entry, but… I don't know what it is about my brain, but I can read and re-read man pages and still fail to understand what it is saying. I do much better with examples. I did some googling and found http://emg-2.blogspot.com/2008/01/zsh-unique-features.html and once I had that I could go back and look at the `man` page to understand what it was doing. So here is my first attempt at using `zparseopts`: zparseopts -D -E -A MyVariableNameHere -- a b -orange -grape -apple if (( ${+MyVariableNameHere[-a]} )); then echo "Apple"; fi if (( ${+MyVariableNameHere[--apple]} )); then echo "Apple"; fi if (( ${+MyVariableNameHere[-b]} )); then echo "Banana"; fi if (( ${+MyVariableNameHere[--orange]} )); then echo "orange"; fi if (( ${+MyVariableNameHere[--grape]} )); then echo "grape"; fi Questions: 1. Is there a way to combine the -a and --apple statements into one? 2. Are a series of 'if' statements the best way to handle these sorts of options? What I have been doing is something like this: for MyVariableNameHere in "$@" do case "$MyVariableNameHere" in -a|--apple) echo "Apple" shift ;; -b|--banana) echo "Banana" shift ;; esac done but that has the disadvantage of not being able to parse "-ab" as two separate arguments. OTOH it's very readable and I don't have to worry about very many chances of missing a closing bracket or brace! TjL ps - if anyone knows of a good place for zparseopts examples, please let me know. Google was not very much help.