评估字符串" a + b + c"作为shell脚本中的实际数字总和

时间:2015-06-16 08:17:42

标签: bash shell scripting

我试图创建一个脚本来读取逗号分隔值的文件,如下所示:

  

10,20,30,40

     

30,50,20,80

我希望它能获得每一行并打印出添加所有数字的结果,就像应用地图功能一样,可能还有很多更好的方法可以做到这一点,但是我'我很好奇,如果可能的话:

#!/bin/bash
while IFS='' read -r line; do
    field=$line 
    result=$(echo $line | tr ',' '+')
    echo $(expr $result)    #Here i would have the string "10+20+30+40"
done < <(cat "$1")

我想要的是获得添加那些而不是字符串的结果,我不知道这是否可能。 对不起凌乱的解释。

5 个答案:

答案 0 :(得分:3)

+和数字之间需要一个空格。而是做:

#!/bin/bash
while IFS='' read -r line; do
    field=$line 
    result=$(echo $line | sed 's/,/ + /g')
    echo $(expr $result)   
done < "$1"

您也不需要cat $1,您可以将其直接重定向到循环中。

答案 1 :(得分:1)

您可以使用isset($_POST['sign-up'])

bc

答案 2 :(得分:1)

使用算术展开$((...))代替expr

while read -r line ; do
    result=${line//,/+}
    echo $(($result))
done < "$1"

我还使用了参数展开而不是tr

答案 3 :(得分:0)

您可以使用awk

在一行中实现此目的
awk -F, '$0 {s=0;for(i=1;i<=NF;i++) s+=$i; print s}' "$1"

输出:

100
180

说明:

  • -F,:将,设置为字段分隔符
  • $0 {..}:确保行($0)不为空
  • 最后,总结每行的所有字段(s+=$i

答案 4 :(得分:0)

您可以使用将值拆分为数组,然后使用简单循环迭代数组并添加值。

#!/bin/bash
while IFS='' read -r line; do
    IFS=, read -a values <<< "$line"
    result=0
    for i in ${values[@]}; do
       result=$((result + i))
    done
    echo "$result"
done < "$1"

更短但更神秘的方法是使用bash参数扩展将每个逗号转换为空格包围的加号,然后将生成的未加引号扩展传递给{{1 }}

expr