如何使用bash读取文件的内容,然后拆分该文件中的行,并将它们作为参数调用java程序?

时间:2017-02-05 10:49:34

标签: java bash

我有一个使用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语句进行算术运算。

所以我认为这个问题在某个地方分裂,但不确定。任何人都可以帮助我指出问题在哪里以及如何解决?

1 个答案:

答案 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结尾