problem with spaces and argument parsing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting problem with spaces and argument parsing
# 1  
Old 12-18-2007
problem with spaces and argument parsing

[Preliminaries: the discussion below will refer to a Java class named HelloWorld. Its totally irrelevant to this posting what that class does, since the problem that I describe has to do with the shell, not Java. Its just that the problem arose for me while doing some coding, and I could not think of a more universal illustration.

Nevertheless, if you need something concrete in order to duplicate my actions, then the source file HelloWorld.java that I used contained the text
Code:
public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Welcome, master");
	}
}

and I compiled using
javac HelloWorld.java
]



Suppose that I execute the following command directly from the shell:
java -XX:OnError="gdb - %p" HelloWorld
Then it works perfectly fine, as expected.

Now suppose that I create the following shell script:
Code:
#!/bin/sh
echo java  -XX:OnError=\"gdb - %p\"  HelloWorld
java  -XX:OnError=\"gdb - %p\"  HelloWorld

The output now is:
java -XX:OnError="gdb - %p" HelloWorld
Unrecognized option: -
Could not create the Java virtual machine.
OK, the echo line outputs exactly what was previously executed directly from the shell, but the script's attempt to execute it fails. The error message hints that the
"gdb - %p"
is actually being interpreted as 3 different words for some strange reason, namely
"gdb
-
%p"
In fact, I think that I can confirm this by modifying the script to be
Code:
#!/bin/sh
echo java  -XX:OnError=\"gdb - %p\"  HelloWorld
set -x
java  -XX:OnError=\"gdb - %p\"  HelloWorld
set +x

which outputs
java -XX:OnError="gdb - %p" HelloWorld
+ java '-XX:OnError="gdb' - '%p"' HelloWorld
Unrecognized option: -
Could not create the Java virtual machine.
+ set +x
Notice how set -x puts the first pair of single quotes around just
-XX:OnError="gdb
and then the next pair around
%p"
So what is the shell script doing in its interpretation of the text that the shell command line does not do that is causing this to fail?

I guess that shell scripts are not exactly like saved command line sessions after all?

Could I work around this by using some sort of octal escape or something for the spaces inside "gdb - %p"?
# 2  
Old 12-18-2007
Quote:
Originally Posted by fabulous2
So what is the shell script doing in its interpretation of the text that the shell command line does not do that is causing this to fail?
The shell is interpreting

Code:
java  -XX:OnError=\"gdb - %p\"  HelloWorld

as the following list of arguments....

0: java
1: -X:OnError="gdb
2: -
3: %p"
4: HelloWorld

The question is what do you actually want -XX:OnError to be?
# 3  
Old 12-18-2007
Quote:
Originally Posted by porter
The question is what do you actually want -XX:OnError to be?
Sorry if my inital psot was unclear. I want
-XX:OnError="gdb - %p"
to be interpreted as a single argument, not as 3 separate arguments as is currently happening.

I should have mentioned that I tried guessing and putting single and double quote marks around it, all to no avail. This is a very frustrating aspect of sh files compared to conventional languages like Java; there are so many gotchas that you feel like you are standing on quicksand sometimes.
# 4  
Old 12-18-2007
Quote:
Originally Posted by fabulous2
I want
-XX:OnError="gdb - %p"
Try escaping the spaces that you want the shell to ignore....

Code:
-XX:OnError=\"gdb\ -\ %p\"

or quoting...

Code:
-XX:OnError="\"gdb - %p\""

# 5  
Old 12-19-2007
Quote:
Originally Posted by porter
Try escaping the spaces that you want the shell to ignore....

Code:
-XX:OnError=\"gdb\ -\ %p\"

or quoting...

Code:
-XX:OnError="\"gdb - %p\""

Does that really escape the spaces? I thought that the backslash only worked for certain subsequent chars (e.g. another \, or an n, etc).

Regardless, I tried it and it does not work.

I also tried using the octal code \040 instead of the space and the command now executes, but it uses the literal chars "\040" so that if a java error ever occured then it would fail at that point.

I had previously tried quotes like what you suggest, in both single and double quote versions, and both fail for me.
# 6  
Old 12-19-2007
The \ escaping works for me on Solaris 9

C program compiled as a.out

Code:
#include <stdio.h>

int main(int argc,char **argv)
{
        int i=0;
        while (i < argc) { printf("argv[%d]=%s\n",i,argv[i]); i++; }

        return 0;
}

script...

Code:
#!/bin/sh

./a.out java "-XX:OnError=\"gdb - %p\"" HelloWorld

output

Code:
argv[0]=./a.out
argv[1]=java
argv[2]=-XX:OnError="gdb - %p"
argv[3]=HelloWorld

similarly...

Code:
#!/bin/sh -x

./a.out java -XX:OnError=\"gdb\ -\ %p\" HelloWorld

gives

Code:
argv[0]=./a.out
argv[1]=java
argv[2]=-XX:OnError="gdb - %p"
argv[3]=HelloWorld

# 7  
Old 12-19-2007
Maybe this is a unix variant problem.

On cygwin, when I use
Code:
\"gdb\ -\ %p\"

I see a single space (" ") in echo's output. But the java command fails because the script is still interpreting the above line as 3 separate arguments instead of a single one, so the java command thinks that it is receiving a bogus option named "-".

On linux (2.6.9-022stab070.9-enterprise), the echo output is again correct, but the overall command fails due to a different error. Hmm...
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Bash script not parsing file with spaces in path

Hi everyone, I'm trying to write my first ever shell script, the OS is Raspbian. The code I have written must be executed whenever a certain database has been modified. The database resides on a Windows server to which I have a mount point, and I have no control over the Windows server at all so... (2 Replies)
Discussion started by: gjws
2 Replies

2. Shell Programming and Scripting

Check for spaces in input argument!

Hi guys, I have created a csh script which allows user to pass input argument with the script like: cluster_on_lev3.csh -t <value> -p <value> Example: cluster_on_lev3.csh -t 2.3 -p 0.05 Now I want to create an error code where if user passes input argument without spaces , the code... (16 Replies)
Discussion started by: dixits
16 Replies

3. Shell Programming and Scripting

The last argument contains spaces, how do I get it into a variable?

Gooday I have an argument string that contains 15 arguments. The first 14 arguments are easy to handle because they are separated by spaces ARG14=`echo ${ARGSTRING} | awk '{print $14}'` The last argument is a text that may be empty or contain spaces. So any ideas on how I get the last... (23 Replies)
Discussion started by: zagga
23 Replies

4. Shell Programming and Scripting

parsing argument in perl

in bash: LIST=`cat $1` for i in $LIST do ... done how will i do this in perl ? $1 is my first arguement. I'm a newbie in perl and will appreciate much your help guys ... (4 Replies)
Discussion started by: linuxgeek
4 Replies

5. Shell Programming and Scripting

Question about argument parsing in scripts

Hello all, I am relatively new to linux and bash scripting. I have what seems to be a simple question but I'm having trouble finding the answer. The question is what is the difference between the variables $@ and $*. I've seen them both used in the same context, and I've tried a number of... (4 Replies)
Discussion started by: nicthu
4 Replies

6. Shell Programming and Scripting

Perl Parsing Argument

i wanna passing an argument which read in a file or a set of files if the files are given in the command line, otherwise use STDIN if no file argument. i got something like that, but it is not really working. so can anyone help me? which one is better to use for and how? Use perl. Thank you ... (0 Replies)
Discussion started by: mingming88
0 Replies

7. Shell Programming and Scripting

Problem with parsing filenames containing spaces

I tried using the following options to parse the *.sh files in a dir (the name can contain spaces). But each of them breaks: FILESSH=$(ls /mysh/*.sh) echo "$FILESSH" | while read FILE ; do --- do something --; done This does not break for any whitespaces in filenames for FILE in... (1 Reply)
Discussion started by: amicon007
1 Replies

8. Shell Programming and Scripting

argument parsing...

Hi all, Iam a beginer in shell scripting. i need a script that can parse the arguments and store them in variables. ex: ./myScript -v v1 -h v2 -c v3...... can someone suggest me...? tnx in adv. (1 Reply)
Discussion started by: midhun_u
1 Replies

9. UNIX for Dummies Questions & Answers

command line argument parsing

how to parse the command line argument to look for '@' sign and the following with '.'. In my shell script one of the argument passed is email address. I want to parse this email address to look for correct format. rmjoe123@hotmail.com has '@' sign and followed by a '.' to be more... (1 Reply)
Discussion started by: rmjoe
1 Replies

10. Shell Programming and Scripting

shell script argument parsing

how to parse the command line argument to look for '@' sign and the following with '.'. In my shell script one of the argument passed is email address. I want to parse this email address to look for correct format. rmjoe123@hotmail.com has '@' sign and followed by a '.' to be more... (1 Reply)
Discussion started by: rmjoe
1 Replies
Login or Register to Ask a Question