Bash为java调用添加了一个额外的字符

Bash为java调用添加了一个额外的字符,java,bash,Java,Bash,我有一个从命令行调用的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”作为

我有一个从命令行调用的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”作为第二个参数而不是第三个参数时,这不会发生。有人能帮我理解发生了什么事吗?我是否忽略了最后一个字符?谢谢。

明智的做法是清理输入,修剪尾随和前导空格(不仅仅是命令行参数,在大多数情况下,在读取文本数据时也是如此)


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

明智的做法是清理输入,修剪尾随和前导空格(不仅是命令行参数,而且在大多数情况下,当您读取文本数据时)


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

Bash没有添加任何内容。你的编辑做了。始终确保将文件保存为UNIX格式的文本文件,以避免回车

为了练习,让我们制作一个简单、自包含的测试用例,以便我们自己和其他人更容易地解决您的问题。有关执行此操作的提示,请参见

下面是一个用于验证行为的简单程序:

$ 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
$tr-d'\r'修复脚本
$bash修复脚本a b 2
第三个参数有1个字符

Bash没有添加任何内容。你的编辑做了。始终确保将文件保存为UNIX格式的文本文件,以避免回车

为了练习,让我们制作一个简单、自包含的测试用例,以便我们自己和其他人更容易地解决您的问题。有关执行此操作的提示,请参见

下面是一个用于验证行为的简单程序:

$ 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
$tr-d'\r'修复脚本
$bash修复脚本a b 2
第三个参数有1个字符

请发布真正的“脚本”。听起来像是您在Windows上创建了bash脚本,因此文件有CRLF行结尾。尝试在文件上使用dos2unix。请发布真正的“脚本”。听起来像是您在Windows上创建了bash脚本,因此文件有CRLF行结尾。尝试在文件上使用dos2unix。