Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi wise ones. I'm having a problem with interpolation with one of my perl scripts. I am pretty sure the issue is the shell, and not my script, but here is the scenario:

One of our tools (HP Open view) -- can send output of monitoring alerts into various pieces via linux/unix string variables (like $OPC_MSG_TEXT) -- which we use primarily in bash scripts. This is handy, since you can just slurp them in and call them via $1, $2, $3, $4, etc.

Problem is I want to use perl for some more advanced parsing. Several of these variables contain spaces, line returns, etc. If I try to pass the variables directly to perl as arguments, (such as ovo-test.pl $OPC_MSG_TEXT), it does't store all the contents of $OPC_MSG_TEXT into $ARGV[0] -- it splits the contents based on spaces..my understanding is that this is default linux/unix behavior?

Anyway -- I am trying to find a way to slurp these bash variables into my perl script, and keep all original white spacing, etc. Not sure how to go about this. I'd really like to minimize the usage of bash.

Any suggestions? I really don't want to use a bash script with embedded perl if at all possible.

  • Comment on Any tips on passing bash variables as arguments to a perl script (that contain spaces and/or non-ascii characters)

Replies are listed 'Best First'.
Re: Any tips on passing bash variables as arguments to a perl script (that contain spaces and/or non-ascii characters)
by hippo (Archbishop) on Apr 17, 2015 at 08:30 UTC
    If I try to pass the variables directly to perl as arguments, (such as ovo-test.pl $OPC_MSG_TEXT), it does't store all the contents of $OPC_MSG_TEXT into $ARGV[0] -- it splits the contents based on spaces..my understanding is that this is default linux/unix behavior?

    For practical purposes, yes. But to be completely correct, it is the shell which does the variable expansion and as you have said in the title in this case your shell is bash.

    The variables are features of the shell and as such when you use them on the command line as arguments to other programs (perl or anything else) the shell substitutes the variables for their contents. As wrog points out, the simple way to tell the shell not to monkey with internal spacing when making this substitution is to enclose the variables in double quotes. You can test this pretty easily yourself if in any doubt:

    $ dummy="What a lot of spaces." $ echo $dummy What a lot of spaces. $ echo "$dummy" What a lot of spaces.

    It's not just spaces you need to worry about. Other characters are important to the shell and may result in unintended behaviour. See the section Quoting in the bash manpage for the full details and the bash hackers wiki for further discussion and examples.

Re: Any tips on passing bash variables as arguments to a perl script (that contain spaces and/or non-ascii characters)
by RonW (Parson) on Apr 17, 2015 at 22:35 UTC

    Besides wrog's suggestion to enclose them in double quotes, you can export them, then they will be accessible in Perl via %ENV

    #!/usr/bin/bash # do other processing # export the desired variables export OPC_MSG_TEXT OPC_MSG_CODE # use Perl for further processing ovo-test.pl
    #!/usr/bin/perl use strict; use warnings; my $text = $ENV{OPC_MSG_TEXT}; my $code = $ENV{OPC_MSG_CODE}; ...;
Re: Any tips on passing bash variables as arguments to a perl script (that contain spaces and/or non-ascii characters)
by Anonymous Monk on Apr 16, 2015 at 23:28 UTC
      since the question is about about Linux and bash, you can probably skip the page about quoting on non-Unix systems; the bash manual is what you want. Most of the time, putting the arguments in double quotes does what you want, e.g.,
      scriptname ... "${OPC_MSG_TXT}"
      will ensure that whatever $OPC_MST_TXT expands to ends up as a single positional parameter
Re: Any tips on passing bash variables as arguments to a perl script (that contain spaces and/or non-ascii characters)
by locked_user sundialsvc4 (Abbot) on Apr 17, 2015 at 14:36 UTC

    ... and when dealing with server-type programs, standard representations such as YAML or JSON (or, of course, XML), have already solved the problem of reliably passing “funny-looking” values back and forth.   Not useful on the command-line, but intended for things like HTTP.   (CPAN has off-the-shelf support for everything, of course.)