How to avoid preceding whitespace using getopts?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to avoid preceding whitespace using getopts?
# 1  
Old 07-23-2019
How to avoid preceding whitespace using getopts?

I wish to avoid preceding white space for getopts variables.

Below is my test.sh script:

Code:
while getopts ":a:b:c:" opt
do
   case "$opt" in
      a ) Region=$OPTARG;;
      b)Environment=$OPTARG;;
      c ) Location="$OPTARG";;
   esac
done

echo "$Region"
echo "$Location"
echo "This_is_fine"
echo "$Environment"

Output:
Quote:
# ./test.sh '-a Europe' '-b INDIA' '-c PRODUCTION'
Europe
PRODUCTION
This_is_fine
INDIA
As you can see there is a preceding whitespace in the output for Ëurope, PRODUCTION and INDIA.

Is it possicle to get the variables not have any whitespaces and avoid usig trim functionality of shell script.

I m using both bash and non-bash shell.
# 2  
Old 07-23-2019
We can't see as you are using Quote instead of Code tags.

Just dropping the single quotes gets you there:

Code:
./test.sh -a Europe -b INDIA -c PRODUCTION
Europe
PRODUCTION
This_is_fine
INDIA

# 3  
Old 07-23-2019
What if the incoming request to the test script is from a tool call Jenkins and the parameters could be multiline strings or comma separated which enforces us to have quotes around each argument. Any suggestions on such a case?
# 4  
Old 07-23-2019
Then I would suggest posting a sample of what that looks like so we can contemplate ways to deal with it. Post what it looks like in the tool, and the actual arguments the shell receives.

OP's script is trivially solved with

Code:
set -- $*

while getopts ":a:b:c:" opt
do
   case "$opt" in
      a) Region=$OPTARG;;
      b)Environment=$OPTARG;;
      c) Location="$OPTARG";;
   esac
done

echo "$Region"
echo "$Location"
echo "This_is_fine"
echo "$Environment"

...but I suspect there's spaces you don't want to split on too, and we have no idea how to tell those apart from those spaces which you do.

OP's problem is also trivially worked around just by doing ./test.sh '-aEurope' '-bIndia' '-cProduction'

Last edited by Corona688; 07-23-2019 at 02:01 PM..
This User Gave Thanks to Corona688 For This Post:
# 5  
Old 07-25-2019
I was looking for the solution proposed by @Corona688. However, if the last arguments '-c' does not have any value associated which is fine; the script fails and displays the helpFunction. I want -c to be optional with or without a value. So, '-c' or '-c<args>' both should work.

Changing
Code:
      ? ) helpFunction;;

to
Code:
      \? ) helpFunction;;

makes all parameters optional however, I am looking for just parameter -c to be optional (-c may not neccessarily be the last parameter)

I want the solution to work for both bash and non-bash.

I'm using a helpfunction like below:

Code:
helpFunction()
{
   echo ""
   echo "Usage: $0 -a Region -b Location -c Environment"
   echo -e "\t-a Description of what is Region"
   echo -e "\t-b Description of what is Location"
   echo -e "\t-c Description of what is Environment"
   exit 1 # Exit script after printing help
}

and

Code:
while getopts ":a:b:c:" opt
do
   case "$opt" in
      a ) Region=$OPTARG;;
      b)Environment=$OPTARG;;
      c ) Location="$OPTARG";;
      ? ) helpFunction;;
   esac
done

echo "$Region"
echo "$Location"
echo "This_is_fine"
echo "$Environment"


Last edited by mohtashims; 07-25-2019 at 03:13 AM.. Reason: To provide more information about parameter c
# 6  
Old 07-25-2019
Quote:
Originally Posted by mohtashims
I was looking for the solution proposed by @Corona688. However, if the last arguments '-c' does not have any value associated which is fine; the script fails and displays the helpFunction. I want -c to be optional with or without a value. So, '-c' or '-c<args>' both should work.
I don't think the builtin getopts allows for optional arguments, unfortunately. If you are on a GNU system and have access to the external GNU version of getopt you can have optional arguments to one or more of your options, but I believe getopt is considered deprecated. Its usage is also inconsistent with that of getopts.

Andrew
# 7  
Old 07-25-2019
Hi.

In solving problems, I find it most useful to search for solutions before inventing my own. I keep a list of notes and sources for command-line-processing, posted below. You may want to consider items 4 and 5 below, neither of which is trivial to use. However, because of your requirement to run on all shells, I think you will probably have to do your own processing with the lowest common denominator features of the Bourne shell -- no additional features such as found on bash, ksh, zsh, etc. Of course, you could choose the most-feature-rich shell, possibly zsh or pwsh, and write simple driver scripts for the other shells, provided you can install zsh / pwsh on all systems that you need. The perl modules have extensive support for command-line options, so one could write a perl code that processed arguments, and then have the perl code call a vanilla shell script with simple arguments.

Good luck, I'd be interested in how you solve this ... cheers, drl

Code:
       
Process command-line (CLI) options, arguments

        1) getopts, builtin, bash, ksh, zsh
           http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options
           Also, search for option processing, including:
           http://mywiki.wooledge.org/ComplexOptionParsing

        2) perl: many, including libgetopt-euclid-perl, which
           creates man page, help automatically

        3) getopt, enhanced getopts, part of the util-linux, allows GNU "--"
           Examples: /usr/share/doc/util-linux/examples, 2016.03.27

        4) argp.sh, wrapper for getopt, creates man and help (text, XML), etc.
           Allows mixed options and arguments.
           Compiled argp.c -> argp for faster execution.
           https://sourceforge.net/projects/argpsh/, 2016.03.27

        5) shflags, wrapper for getopt, creates help, allow mixed options
           and arguments
           https://github.com/kward/shflags, 2016.08.01

        6) ksh getopts, enhanced, process GNU "--", creates man, help, etc.
           Examples: Learning the Korn Shell, O'Reilly, 2nd, p 380ff

        7) zsh zparseopts
           man zshmodules, part of zshutil

        8) getopts_long.sh, a getopts that supports long options à la GNU for POSIX
           shells 
           http://stchaz.free.fr/getopts_long.sh

        9) Suggested option names:
           http://www.shelldorado.com/goodcoding/cmdargs.html#flagnames


Last edited by drl; 07-25-2019 at 09:11 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Extract whole word preceding a specific character pattern with first occurence of the pattern

Hello. Here is a file contents : declare -Ax NEW_FORCE_IGNORE_ARRAY=(="§" ="§" ="§" ="§" ="§" .................. ="§"Here is a pattern =I want to extract 'NEW_FORCE_IGNORE_ARRAY' which is the whole word before the first occurrence of pattern '=' Is there a better solution than mine :... (3 Replies)
Discussion started by: jcdole
3 Replies

2. Shell Programming and Scripting

Print next line beside preceding line on column match

Hi, I have some data like below: John 254 Chris 254 Matt 123 Abe 123 Raj 487 Moh 487 How can i print it using awk to have: 254 John,Chris 123 Matt,Abe 487 Raj,Moh Thanks. (4 Replies)
Discussion started by: james2009
4 Replies

3. Linux

Print each ; separated value, in front of the value preceding them

I have a file that looks like this, P38112 Q12389; Q03532; P43586; Q08208; P37838; P40693; P38805 Q12389 P32892; P36049; Q03532; P43586; Q12176; P38112; P39744; P37838 P11154 P39940 P50094 P50095 P32892 Q12389; Q04660; P43586; P37838; P40693 Q05022 Q08235; Q12176; P39744 P40347 P32333... (2 Replies)
Discussion started by: Syeda Sumayya
2 Replies

4. Shell Programming and Scripting

Find the closest value in another csv file preceding it and following it?

Hi, Is this possible? I want to take a csv file and find the closest value in another csv file preceding it and following it. For ex. In this csv file, I'll take the first line: 1309341156.800000000 1309341156.802500000 1309341156.805000000 1309341156.807500000 and find the closest... (2 Replies)
Discussion started by: superbbrr
2 Replies

5. Shell Programming and Scripting

awk to transpose preceding row to 1st column of next rows

Gurus: How can I transpose the output below to a format in which I can plot a graph to show VSZ memory usage by PIDs? stdout: Tue Jan 22 07:29:19 CUT 2013 42336296 1841272 java wilyadm 21889232 438616 jlaunch sidadm 42532994 414336 jlaunch sidadm Tue Jan 22 07:49:20 CUT 2013... (1 Reply)
Discussion started by: ux4me
1 Replies

6. Shell Programming and Scripting

Find Node and replace line(s) preceding in xml file

Hello, I have an xml file whose contacts are like below: <Node>Apple <B>Value1</B> <B>Value2</B> <B>Value3</B> </Node> <Node>Mango <B>Value1</B> <B>Value2</B> <B>Value3</B> </Node> <Node>Apple <B>Value1</B> <B>Value2</B> <B>Value3</B> </Node> <Node>Bannana (3 Replies)
Discussion started by: umarsatti
3 Replies

7. Shell Programming and Scripting

How to match (whitespace digits whitespace) sequence?

Hi Following is an example line. echo "192.22.22.22 \"33dffwef\" 200 300 dsdsd" | sed "s:\(\ *\ \):\1:" I want it's output to be 200 However this is not the case. Can you tell me how to do it? I don't want to use AWK for this. Secondly, how can i fetch just 300? Should I use "\2"... (3 Replies)
Discussion started by: shahanali
3 Replies

8. Shell Programming and Scripting

Log File - Getting Info about preceding Date of Pattern Found

Ok Suppose I have a log file like the below: 2010-07-15 00:00:01,410 DEBUG 2010-07-15 00:01:01,410 DEBUG 2010-07-15 00:01:02,410 DEBUG com.af ajfajfaf affafadfadfd dfa fdfadfdfadfadf fafafdfadfdafadfdaffdaffadf afdfdafdfdafafd error error failure afdfadfdfdfdf EBUDGG eafaferror failure... (6 Replies)
Discussion started by: SkySmart
6 Replies

9. Shell Programming and Scripting

Finding word in file then print the preceding....

Hi, I am looking for a way to find a particular word in a file then print a line that precedes this line, as well as this line. Sometimes in a log file there is only one word per line and I need to print one of the lines leading up to the single worded line. Example - I can grep for ouch... (5 Replies)
Discussion started by: g_jumpin
5 Replies

10. Programming

Error: No direct declarator preceding "("

Hi, while compiling my c++ program, I get the following Message: /usr/include/iso/math_iso.h", line 84: Error: No direct declarator preceding "(" Does anybody know this? Thanks Nik (1 Reply)
Discussion started by: nik
1 Replies
Login or Register to Ask a Question