我有一个使用RMI的简单计算器。客户端接受3个参数,operand1,operand2和operator。它可以通过以下方式调用:
java SingleCalculatorClient 8 9 /
输出应为:
ebin@tux:~/DS$ java SingleCalculatorClient 8 9 +
Expected result of 8+9(by direct operation) : 17
Popped value of 8+9from stack : 17
为了测试访问同一服务器的多个客户端,我有一个文本文件,其中有一些格式为operand1,operand2和operator的行。示例文件如下:
5 4 +
6 7 /
8 8 -
我有一个bash脚本,它读取文件,拆分行,调用其中的java Client。脚本如下:
#!/bin/bash
input="test.txt"
while IFS= read -r var
do
stringarray=( $var )
java SingleCalculatorClient ${stringarray[0]} ${stringarray[1]} ${stringarray[2]}
done < "$input"
不知何故,当我运行它时,java输出非常奇怪。示例输出是:
ebin@tux:~/DS$ ./script.sh
4(by direct operation) : 0
4from stack : 0 5+
7(by direct operation) : 0
7from stack : 0 6/
8(by direct operation) : 0
8from stack : 0 8-
即使文件中只有一行,输出也始终为0 。我不明白为什么输出语句被截断。
如果我尝试在bash中打印拆分单词,结果证明是正确的。如果我回应它,这是输出:
ebin@tux:~/DS$ ./script.sh
5 4 +
6 7 /
8 8 -
而不是读取文件和拆分单词,如果我只是在bash脚本中使用一些参数调用java客户端,它也可以正常工作。
这是java部分,它接受参数,然后推送到堆栈:
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
String operation = args [2];
if(operation.equals("x"))
operation="*";
Calculator calculator = (Calculator) Naming.lookup("rmi://127.0.0.1:1100/CalculatorOperations");
calculator.pushValue(x);
calculator.pushValue(y);
calculator.pushOperator(operation);
在堆栈上,它只是弹出值,并使用switch语句进行算术运算。
所以我认为这个问题在某个地方分裂,但不确定。任何人都可以帮助我指出问题在哪里以及如何解决?
答案 0 :(得分:2)
您应该不重置输入字段分隔符IFS=
,它需要具有默认值tab/space/newline
才能访问行中的各个字段。
此外,您缺少-a
选项,read
需要读入数组,以便您可以访问各个元素。即。
input="test.txt"
while read -r -a var
do
java SingleCalculatorClient "${var[0]}" "${var[1]}" "${var[2]}"
done < "$input"
或者)您不需要数组只使用read
input="test.txt"
while read -r op1 op2 op
do
java SingleCalculatorClient "$op1" "$op2" "$op"
done < "$input"
另外,如果您要将代码从Windows复制粘贴到Linux计算机,请通过运行DOS CRLF
dos2unix script.sh
结尾