使脚本A与脚本B(Bash)交互

时间:2018-03-19 22:41:17

标签: bash

我有这个bash脚本为我运行微积分操作。它以“阅读”开始......

如何让脚本A在脚本B中输入值,读取输出并再次关闭脚本B?

示例:

#ScriptA.sh
a=12
b=4
[open Script B, enter $a and $b and read the result]
echo "The result is [the result of Script B]."

#ScriptB.sh
read x y
echo $(($x+$y))

期望的输出:

bash ScriptA.sh
The result is 16.

当然,这是关于更复杂的数学,但你明白了。请注意,为方便起见,我不想更改脚本B的结构(读取x y)。但我希望这里有一些人可以解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

你应该这样做:

#!/bin/bash

a=12
b=4

result=$(echo $a $b | ./script_b.sh)
echo "the result is $result"

答案 1 :(得分:0)

脚本B应该像-bc一样工作。

示例:

echo `echo "4^3.5" | -scriptb.sh`
[result]

编辑:我自己想出了解决方案的一部分,并认为我会分享它:

# ScriptA.sh

echo `echo "44 33" | bash ScriptB.sh`

# ScriptB.sh

read x y
echo $(($x+$y))

输出:

bash ScriptA.sh
77

下一个问题是我的ScriptB.sh看起来更像这样:

# ScriptB.sh

until [[ 1 = 2 ]]; do
echo Enter x and y
read x y
    if [[ x = q ]]; then
    break 1
    fi
echo $(($x+$y))
done

如果我想手动使用ScriptB,这是为了允许多个输入。如果我让ScriptA以上述方式使用ScriptB,则输出如下所示:

bash ScriptA.sh
b.sh: line 9: +: syntax error: operand expected (error token is "+")
Enter x and y 77 Enter x and y

似乎是这样的情况,在ScriptA输入44和33并且命中输入后,就像它应该的那样,但它会立即进入第二次触发语法错误消息并结束ScriptB。这是次优的,因为在真实的ScriptB的情况下,它将输入“(standard_in)1:解析错误”链,导致根本没有结果。解决这个问题的方法是教会ScriptA阅读ScriptB所承诺的结果并在此之后结束它。或者让它输入“q”作为第二个输入,而不是仅仅按下输入。

编辑2:

确定。得到它了。脚本A应如下所示,以便按预期工作:

e=2.7182818285
pi=3.141
a=$(printf "$e $pi \n q \n" | bash ScriptB.sh)
a=${a:14:20}
echo $a