如何在bash中使用逗号分隔的整数读取文件

时间:2017-04-25 18:25:48

标签: bash

我对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.bashdata.txtcalc.bashcalcUI.bash进行沟通。

1 个答案:

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