我有一个我从命令行调用的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”作为第二个参数而不是第三个参数时,这不会发生。谁能帮我理解发生了什么?我是否只是忽略了最后一个角色?感谢。
答案 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
)。