我对bash很新,我一直试图弄清楚如何从文件中读取数字,例如data.txt或data.csv到一个名为calc.bash的文件中。
我的界面工作正常,但我仍然坚持如何将数字读入calc.bash,这样我才能使计算工作。我还想知道如何保持我选择的2个数字的位置+ - * /然后使用另一个操作获得更多数字。
例如。
我们在data.txt中有一个数字列表1,3,4,6,10,12END 我读了1和3并将它们加在一起。 如何保存我最后离开的位置,这样我就可以用4号进行另一个操作。所以1 + 3 = 4然后4 + 4 = 8然后如果我想减去它将一直是8-6直到我点击了END。但只有他们选择这样做。
如果他们选择不使用前一个号码+ - * /和下一个号码。您将继续列表中的下两个数字。所以,如果你已经完成1,3,那么你继续4,6
这就是我的CalcUI.bash看起来像
#!/bin/bash
while true; do
read -p "Enter operation to be performed (+-/ or Q to Quit): " op
case $op in
[+] ) echo "You chose +"; echo "+" >> Inst.txt; break;;
[-]* ) echo "You chose -"; echo "-" >> Inst.txt; break;;
[*] ) echo "You chose *"; echo "*" >> Inst.txt; break;;
[/]* ) echo "You chose /"; echo "/" >> Inst.txt; break;;
[Qq]* ) exit;;
* ) echo "Please answer using the following +-/ or Q to Quit";;
esac
done
while true; do
read -p "Use previous result as operand?(y/n): " pr
case $pr in
[Yy] ) echo "You chose y";echo "y" >> Inst.txt; break;;
[Nn]* ) echo "You chose n";echo "n" >> Inst.txt; break;;
* ) echo " Please answer using y or n";;
esac
done
while true; do
read -p "Reset data file pointer to start of data file?(y/n) " reset
case $reset in
[Yy] ) echo "You chose y"; break;;
[Nn]* ) echo "You chose n"; break;;
* ) echo "Enter y or n";;
esac
done
exec ./Calc.bash &
这就是CalcUI.bash看起来喜欢的内容
Running CalcUI:
Enter operation to be performed (+-*/ or Q to Quit): *
Use previous result as operand? (y/n): n
Reset data file pointer to start of data file? (y/n):n
Calc.bash run on Tue Apr 4 14:46:24 CDT 2017 process id 2493
Calculated result for: 3 * 35
Result: 105
press <enter> to continue
我无法弄清楚如何calc.bash
与data.txt
和calc.bash
与calcUI.bash
进行沟通。
答案 0 :(得分:1)
使用功能。
当您在一个文件中执行所有操作时,更容易看到发生了什么
您可以稍后在单独的文件中创建实用程序,source thatfile
可以在调用者中使用环境设置
大多数时候我使用函数我使用echo
返回结果(并使用my_function
调用my_result=$(my_function)
)。当您向控制台写入其他内容时,这将失败。您可以使用全局变量。
将整数作为字段读取可以通过用换行符替换,
来实现(使用tr
)。
解决方案可能看起来像
function get_operator {
while true; do
read -p "Enter operation to be performed (+-/ or Q to Quit): " op
case $op in
[+] ) echo "You chose +";break;;
[-] ) echo "You chose -";break;;
[*] ) echo "You chose \*, (not supported yet) try again";;
[/] ) echo "You chose /";break;;
[Qq] )exit;;
* ) echo "Please answer using the following +-/ or Q to Quit";;
esac
exit
done
}
function get_next_operator {
while true; do
read -p "Use previous result as operand?(y/n): " pr
case $pr in
[Yy] ) break;;
[Nn] ) echo "You chose n";get_operator; break;;
*) echo " Please answer using y or n";;
esac
done
}
unset first_integer
unset op
for k in $(echo "2,4,6,8,9" | tr ',' '\n'); do
echo "Next integer = $k"
if [ -z "${first_integer}" ]; then
first_integer=$k
continue
fi
if [ -z "${op}" ]; then
get_operator
else
get_next_operator
fi
printf "%s %s %s = " "${first_integer}" "${op}" "${k}"
(( first_integer = first_integer $op k ))
printf "%s\n" "${first_integer}"
done