Home Man
Search
Today's Posts
Register

BSD, Linux, and UNIX shell scripting — Post awk, bash, csh, ksh, perl, php, python, sed, sh, shell scripts, and other shell scripting languages questions here.

ksh parsing arguments in a string rather than from the cmdln

Tags
ksh arguments, rhel 6, shell scripts, solved

Login to Reply

 
Thread Tools Search this Thread
# 1  
Old 11-15-2017
ksh parsing arguments in a string rather than from the cmdln

Hi. I have a piece of code that reads and parses command line options. I'd like to alter it slightly to read from a string (that's set elsewhere in the script) rather than directly from the command line (arg). Can somebody show me how to do this? Many thanks.

My code is as follows:

Code:
typeset flags_args=''
for arg; do
    case $arg in
        -version )  flags_args="${flags_args} -t" ;;
        -host ) flags_args="${flags_args} -r" ;;
        -debug ) flags_args="${flags_args} -d" ;;
        * )       flags_args="${flags_args} $arg" ;;
    esac
done
set -- ${flags_args}

while getopts :t:r:d args; do
    case $args in
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="true"; typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;
    esac
done
shift $((OPTIND-1));

Instead of reading the arguments from command line I'd like the code to read from the following variable that's set inside the KSH script:
Code:
STR="-version 99 -host testhost "

or
Code:
STR="-version 99 -host testhost -debug"

# 2  
Old 11-15-2017
Quote:
Originally Posted by pnolanch
Hi. I have a piece of code that reads and parses command line options. I'd like to alter it slightly to read from a string (that's set elsewhere in the script) rather than directly from the command line (arg). Can somebody show me how to do this? Many thanks.

My code is as follows:

Code:
typeset flags_args=''
for arg; do
    case $arg in
        -version )  flags_args="${flags_args} -t" ;;
        -host ) flags_args="${flags_args} -r" ;;
        -debug ) flags_args="${flags_args} -d" ;;
        * )       flags_args="${flags_args} $arg" ;;
    esac
done
set -- ${flags_args}

while getopts :t:r:d args; do
    case $args in
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="true"; typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;
    esac
done
shift $((OPTIND-1));

Instead of reading the arguments from command line I'd like the code to read from the following variable that's set inside the KSH script:
Code:
STR="-version 99 -host testhost "

or
Code:
STR="-version 99 -host testhost -debug"

Many versions of the Korn shell include a getopts that supports both long options and short options (although support for long options isn't always mentioned in the ksh man page). If you could introduce your long options with -- instead of a single -, you might want to try the following replacement for your code:
Code:
while getopts ':t:(version)r:(host)d(debug)' args; do
    case $args in
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;
    esac
done
shift $((OPTIND-1));
printf 'DEBUG has been set to "%s"\n' "$DEBUG"
printf 'HOST has been set to "%s"\n' "$HOST"
printf 'VERSION has been set to "%s"\n' "$VERSION"

and see what happens when you invoke it with:
Code:
script_name --version 99 --host=testhost

and:
Code:
script_name -t 98.6 -rmyhost --debug

When I try the above two commands with ksh on macOS High Sierra (version 10.13.1), I get the output:
Code:
DEBUG has been set to ""
HOST has been set to "testhost"
VERSION has been set to "99"

and:
Code:
DEBUG has been set to "DEBUG"
HOST has been set to "myhost"
VERSION has been set to "98.6"

# 3  
Old 11-15-2017
Thanks Don. But how do I read the parameters into that case statement from a variable set within the script rather than the command line?
# 4  
Old 11-15-2017
Change
Code:
for arg ; do

to
Code:
for arg in $STR ; do

Beware that things like quotes-inside-quotes won't do what you want when you store arguments.
The Following User Says Thank You to Corona688 For This Useful Post:
user052009 (11-15-2017)
# 5  
Old 11-15-2017
yep ... that does the job. Many thanks.
The Following User Says Thank You to user052009 For This Useful Post:
Corona688 (11-15-2017)
# 6  
Old 11-22-2017
Quote:
Originally Posted by user052009
Thanks Don. But how do I read the parameters into that case statement from a variable set within the script rather than the command line?
You can also use a subfunction to parse the command line and feed it the string:

Code:
parse_cmd ()
{
while getopts :t:r:d args; do
    case $args in
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="true"; typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;
    esac
done
shift $((OPTIND-1));

return 0
}


...
# main()
STR="<your arguments here in the same form as parameters from stdin>"

parse_cmd $STR    # process opts and args from STR

parse_cmd $*      # process opts and args from stdin

exit 0

Note that if you use a subfunction like above you need to get the parsed values out of the function somehow, because the variables in it are now local to the function.

I hope this helps.

bakunin
# 7  
Old 11-23-2017
Quote:
Originally Posted by bakunin
You can also use a subfunction to parse the command line and feed it the string:

Code:
parse_cmd ()
{
while getopts :t:r:d args; do
    case $args in
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="true"; typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;
    esac
done
shift $((OPTIND-1));

return 0
}


...
# main()
STR="<your arguments here in the same form as parameters from stdin>"

parse_cmd $STR    # process opts and args from STR

parse_cmd $*      # process opts and args from stdin

exit 0

Note that if you use a subfunction like above you need to get the parsed values out of the function somehow, because the variables in it are now local to the function.

I hope this helps.

bakunin
Hi bakunin,
Note that typeset is not in the standards and the way it behaves varies some between shells. In bash declaring a variable with local or with typeset makes the variable definition have a scope that is local to the function and values assigned to such variables are not visible when the function returns to its caller. But, a variable that is not declared with local nor with typeset has a global scope and if such a variable is assigned a value inside a function, the value assigned in the function will still be visible when the variable is expanded outside of the function.

In ksh, declaring a variable with typeset in a function does not give it a local scope; it has a global scope. The ksh command language does not have a local keyword or built-in function.

So, in both ksh and bash, if you change:
Code:
        t) typeset VERSION="$OPTARG" ;;
        r) typeset HOST="$OPTARG" ;;
        d) typeset DEBUG="true"; typeset DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;

in your sample to:
Code:
        t) VERSION="$OPTARG" ;;
        r) HOST="$OPTARG" ;;
        d) DEBUG="DEBUG" ;;
        *) print "Invalid option specified." ;;

The values assigned to VERSION, HOST, and DEBUG in the function parse_cmd can be found after parse_cmd completes by just expanding those variables with $VERSION, $HOST, and $DEBUG.

Note that I removed the 1st assignment to DEBUG. I don't see any reason to assign it the value TRUE and then immediately assign another value (DEBUG) to it.
Login to Reply

« Previous Thread | Next Thread »
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Shell function parsing arguments, which didn't receive. Why? digioleg54 Shell Programming and Scripting 1 10-27-2017 11:48 PM
Parsing Command Line Arguments In C shell script codecatcher Shell Programming and Scripting 11 04-18-2013 01:32 PM
Parsing command line arguments in Python testin Programming 1 12-16-2011 02:46 PM
Parsing a long string string problem for procmail cwiggler Shell Programming and Scripting 4 09-10-2011 01:15 AM
string manipulation in arguments animesharma Shell Programming and Scripting 2 08-10-2011 06:10 AM
Need help with parsing the arguments using getopts !! SSSB Shell Programming and Scripting 3 05-11-2010 12:13 PM
Parsing Comma separated Arguments Reddy482 Shell Programming and Scripting 4 11-16-2009 02:28 AM
Help parsing command line arguments in bash Breakology Shell Programming and Scripting 3 07-14-2009 06:00 PM
Parsing of file for Report Generation (String parsing and splitting) umar.shaikh Shell Programming and Scripting 8 03-02-2009 12:38 AM
Parsing the command line arguments jayakhanna UNIX for Advanced & Expert Users 7 12-17-2003 06:42 PM


All times are GMT -4. The time now is 06:41 AM.

Unix & Linux Forums Content Copyright©1993-2018. All Rights Reserved.
UNIX.COM Login
Username:
Password:  
Show Password