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.
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?
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..
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
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.
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 2,288
Thanks Given: 430
Thanked 480 Times in 395 Posts
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
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)
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)
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)
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)
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)
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)
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)
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)