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

时间:2014-04-01 18:12:08

标签: 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 \ n或某些此类字符。当我将“2”作为第二个参数而不是第三个参数时,这不会发生。谁能帮我理解发生了什么?我是否只是忽略了最后一个角色?感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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