繁体   English   中英

在shell脚本中将字符串“ a + b + c”评估为数字的实际总和

[英]Evaluate string “a+b+c” as an actual sum of numbers in shell scripting

我正在尝试制作一个脚本,该脚本读取以逗号分隔的值的文件,如下所示:

10,20,30,40

30,50,20,80

我希望它能获得每一行并打印出将所有数字相加的结果,有点像应用map函数,可能有很多更好的方法可以做到这一点,但是我很想知道现在是否可能:

#!/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")

我想要的是获得添加这些结果而不是字符串的结果,我不知道是否可能。 抱歉给您带来混乱的解释。

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

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

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

您可以使用bc

#!/bin/bash
while IFS='' read -r line; do
    echo $line | tr ',' '+' | bc
done < "$1"

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

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

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

您可以使用awk在一行中实现:

awk -F, '$0 {s=0;for(i=1;i<=NF;i++) s+=$i; print s}' "$1"

输出:

100
180

说明:

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

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

#!/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参数扩展将每个逗号转换为空格包围的加号,然后将所得的未引号扩展传递给expr

while IFS='' read -r line; do
    expr ${line//,/ + }
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM