getopts and a list argument


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting getopts and a list argument
# 1  
Old 06-23-2008
getopts and a list argument

Hi,

I'm using bash and ksh93 compatible derivatives.

In a recent getopts experience, I found myself spending far too much
time on this little problem. I hope someone can help...

So here's the deal.

I want to build have a command line interface that accepts either zero,
one, or many parameters of the same type. Assume the script sends
e-mails to a recipient list. I tried to write the code to handle this, but it
did not work:

commandname -r "user1@tld user2@tld user3@tld"

This did not work because the getopts seemed to parse strings using
space as delimiter regardless of the existence of the surrounding double
or single quotes. This resulted in OPTARGS containing only the first
element of the list. (e.g. user1@tld)

So, I changed the UI to be such that any number (0, 1, or more) of the
-r options can be on the command line.

commandname -r user1@tld -r user2@tld -r user3@tld

Now, my getopts loop has this form:

Code:
while getopts "r:" opt; do
    case $opt in
        r) ONE_STRING="${OPTARG}"
            ;;
    esac
    STRING_LIST="${STRING_LIST} ${ONE_STRING}"
done

It successfully grabs every single occurrence of the -r option from the
command line. I created the variable, STRING_LIST, to "accumulate" the
strings.

Is there a better way to do this style of zero, one, or more options of
the same type?

Is there a better way to build a list that does not create anomalies such
as a space character at the beginning or end. (My example above has a
single space character as the 1st character of STRING_LIST, due to fact
it is an empty variable the first time it is referenced on the RHS of
the = sign.)

#####

BTW, I am unable change tools or languages so if you want to suggest
that I use Perl or Ruby or even Java, then please include a example code
(for others to see) otherwise why bother acting like a smarty pants if
you can't display a nice example? Smilie
# 2  
Old 06-23-2008
Quote:
Originally Posted by duderonomy
commandname -r user1@tld -r user2@tld -r user3@tld
With Bash v2 and v3 I get:
Code:
showGetopts() { while getopts "a:b:c:" opt; do case "${opt}" in a|b|c) echo "${opt}: \"${OPTARG}\"";; esac; done; }; showGetopts -a "a@b c@d" -b e@f g@h -c 1 23 4
a: "a@b c@d"
b: "e@f"

Since quoted inconsistently parts of "-b" and "-c" is completely gone from the output.
# 3  
Old 06-23-2008
Hmmm... I wonder what I was doing incorrectly, then?
I will investigate again and get back to this thread.

Thank you!

PS: thx for the nifty way to test options too!

Last edited by duderonomy; 06-23-2008 at 10:24 PM..
# 4  
Old 06-23-2008
I found my bug. I was mucking up command line data before getopts
even had a chance to get a whack at it! Do'h! <Sheepishly> It was
caused by something I was not showing. Ugh.

My "main" was calling a function "process_command_line()" where this
getopts work was being performed. I was calling it this way:

process_command_line $@

I really thought I was doing it correctly by using $@ instead of $*.
Though, not entirely. Evidently, that variable needs to be double quoted,
to get the expected behavior. Like this:

process_command_line "$@"

I wonder why that is? What was I breaking?

Thanks for the feedback! I'm glad I got straightened out now so that I
could avoid writing additional (and unnecessary) code to work around
my bug. Smilie

Hmmm... This makes me wonder if %SOME_LARGE_PERCENTAGE% of
the existing code base in the world is a workaround for what the
programmer did not understand. Smilie

Cheers
Smilie
# 5  
Old 06-24-2008
Quote:
Originally Posted by duderonomy
I wonder why that is? What was I breaking?
The easiest way is make one function "old" style, one "new" style, 'set -vx', then compare output.


Quote:
Originally Posted by duderonomy
Hmmm... This makes me wonder if %SOME_LARGE_PERCENTAGE% of the existing code base in the world is a workaround for what the programmer did not understand.
I don't know the answer to that, but one example I can think of was KDE vs QT. In the past the KDE team did a lot of odd tweakage instead of using QT to its fullest. That changed though. Even if a programmer understands it all there's bound to be hundreds of ways to do something "better" (more efficient, more performant). Wrt scripting reading static guides like the ABS (again), reading fora like these and other peoples scripts helps, the rest is experimenting and "just" gaining experience. And as F/OSS shows, if things can be improved they will be.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Question about getopts optional argument [args...]

There are many places where I can see the syntax description for optargs, which, usually boils down to this: getopts OPTSTRING VARNAME where: OPTSTRING tells getopts which options to expect and where to expect arguments VARNAME tells getopts which shell-variable to use for option reporting... (2 Replies)
Discussion started by: sharkura
2 Replies

2. Shell Programming and Scripting

ksh - default value for getopts option's argument

Hello everyone, I need help in understanding the default value for getopts option's argument in ksh. I've written a short test script: #!/bin/ksh usage(){ printf "Usage: -v and -m are mandatory\n\n" } while getopts ":v#m:" opt; do case $opt in v) version="$OPTARG";; ... (1 Reply)
Discussion started by: da1
1 Replies

3. Shell Programming and Scripting

Specifying a list name as argument and using that list in script.

Is there a way I can specify the name of a list as an argument to a shell script and then use the values of that list name in the script? I need to do this WITHOUT using case statements. Something like this: check.sh list1 #!/bin/bash list1="www.amazon.com www.google.com"... (9 Replies)
Discussion started by: gctaylor
9 Replies

4. Shell Programming and Scripting

Argument list too long

Hi Team, Here's the situation. I have approximately 300000 to 500000 jpg files in /appl/abcd/work_dir mv /appl/abcd/work_dir /appl/abcd/process_dir The above move command will work if the jpg files count is close to 50000 (not sure). If the count is less this mv command holds good. But if... (14 Replies)
Discussion started by: kmanivan82
14 Replies

5. Shell Programming and Scripting

Getopts - space in argument (OPTARG)

Hi, I want to capture space as well from the argument eg: script.ksh -m "Message from xyz" -e "email@xyz.com" script.ksh -m 'Message from xyz' -e 'email@xyz.com' I am parsing using getopts, but for option "m" OPTARG is returning only "Message". Please use code tags next time for... (9 Replies)
Discussion started by: tostay2003
9 Replies

6. Shell Programming and Scripting

mv : Argument list too long

Hi I am using find command -- find "directory1" -type f | xargs -i mv {} "directory2" to avoid above argument list too long problem. But, issue i am facing is directory1 is having subdirectories due to this i am facing directory traversal problem as i dont want to traverse subdirectories... (9 Replies)
Discussion started by: VSom007
9 Replies

7. Shell Programming and Scripting

Argument list too long!!

Dear Experts, I have a list of 10K files in a directory. I am not able to execute any commands lile ls -lrt, awk, sed, mv, etc........ I wanna execute below command and get the output. How can I achieve it?? Pls help. root# awk -F'|' '$1 == 1' file_20120710* | wc -l /bin/awk: Argument list... (2 Replies)
Discussion started by: Naga06
2 Replies

8. Shell Programming and Scripting

getopts : two values to a single argument ?

Hi Gurus I am trying to figure out (with not much success) how to pass two values to a single getopts argument ... for example ./script -a Tuesday sausagesThe $OPTARG variable seems to only get populated with the first argument. What im looking to do is to process the first argument (i.e.make... (6 Replies)
Discussion started by: rethink
6 Replies

9. Shell Programming and Scripting

getopts ... only allow a single instance of an argument?

Hi there, if i have a simple getopts like below ...how can i make it so that if somebody enters more than one -g argument for example, it will error with a " you cannot enter more than one -g" or something like that.? I want to only allow one instance of a -g or a -h etc .. while getopts... (1 Reply)
Discussion started by: hcclnoodles
1 Replies

10. Shell Programming and Scripting

option followed by : taking next option if argument missing with getopts

Hi all, I am parsing command line options using getopts. The problem is that mandatory argument options following ":" is taking next option as argument if it is not followed by any argument. Below is the script: while getopts :hd:t:s:l:p:f: opt do case "$opt" in -h|-\?)... (2 Replies)
Discussion started by: gurukottur
2 Replies
Login or Register to Ask a Question