2014-04-01 82 views
0

我有一个Java程序,我在命令行中调用像这样:击增加了一个额外字符java调用

java -cp bin Main a b 2 

最后一个参数是重要的,因为它是一个数字,我用的Integer.parseInt阅读它。当我使用bash脚本,我使用:

java -cp bin Main $1 $2 $3 

而且我所说的脚本:

./script a b 2 

然而,当我调用脚本无法解析2,因为有一个额外的字符添加到最后一个参数。我试图打印第二个字符,但它不打印可读的字符。我假设额外的字符是\ n或\ r或某些这样的字符。当我将“2”作为第二个参数而不是第三个时,这不会发生。任何人都可以帮助我理解发生了什么?我只是忽略了最后一个字符?谢谢。

+4

**请**发布真实的“剧本”。 –

+2

听起来就像你在Windows上创建了bash脚本,因此该文件具有CRLF行尾。尝试在文件上使用dos2unix。 –

回答

3

Bash没有添加任何东西。你的编辑做到了。务必确保将文件保存为UNIX格式的文本文件以避免回车。

只是为了练习,让我们做一个简单的,自包含的测试用例,让自己和其他人更容易找出您的问题。有关这方面的提示在bash tag wiki中描述。

这里有一个简单的程序来调用验证的行为:

$ cat javamock 
#!/bin/bash 
echo "The third argument has ${#3} characters" 

$ ./javamock a b 2 
The third argument has 1 characters 

这里就是你所看到的

$ cat yourscript 
./javamock $1 $2 $3 

$ bash yourscript a b 2 
The third argument has 2 characters 

好了,我们该如何诊断呢?下面是我们如何能告诉什么是与您的脚本:

$ shellcheck yourscript 
In yourscript line 1: 
./javamock $1 $2 $3 
        ^-- SC1017: Literal carriage return. Run script through tr -d '\r' . 

或如何确认,如果你已经知道你在找什么:

$ cat -v yourscript 
./javamock $1 $2 $3^M 

最后,应用修复:

$ tr -d '\r' <yourscript >fixedscript 
$ bash fixedscript a b 2 
The third argument has 1 characters 
1

清理输入修剪尾随和前导空白(不仅仅是命令行参数,而且大部分时间是在阅读文本数据时),这是明智的做法。

如果您想知道它是什么字符,请尝试打印其数值(转换为short)。

相关问题