【问题标题】:Arithmetic with array elements in bashbash中数组元素的算术运算
【发布时间】:2015-06-02 06:54:49
【问题描述】:

我正在使用 bash 并尝试添加从文件创建的数组的所有元素。

while read line; do
    array=($line);
    sum=0
    length=${#array[@]}
    for i in ${array[@]:0:$length}; do
       sum=$[$sum+${array[i]}]   #<--- this doesn't work?
    done
    echo $sum
done < $1

编辑: 我应该更清楚为什么要在 for 循环中使用数组拆分

输入可能是 ------> david 34 28 9 12

我想打印 ---> david 83

所以我想遍历所有元素接受第一个。所以我会使用:

length=$[${#array[@]} - 1]
for i in${array[@]:1:$length}

因为这个我不能使用:

for i in "${array[@]}"

【问题讨论】:

    标签: arrays bash math arithmetic-expressions


    【解决方案1】:

    尝试使用 expr 添加两个表达式,例如:

    sum=$(expr "$sum" + "${arr[i]}")
    

    或者

    sum=$((sum + arr[i]))
    
    
    echo "11 13" >test.txt 
    echo "12" >>test.txt
    
    while read -a line; do ##read it as array
        sum=0
        for ((i=1; i < ${#line}; i++)); do ##for every number in line
           sum=$(expr "$sum" + "${line[i]}") ## add it to sum
        done
        echo $line[0] $sum ##print sum
    done < test.txt
    Output
    36
    

    OP 编辑​​后:

    echo "ABC 11 13" >test.txt echo "DEF 12" >>test.txt

    while read -a line; do ##read it as array
    sum=0
    for ((i=1; i < $((${#line[@]})); i++)); do ##for every number in line
       sum=$(expr "$sum" + "${line[i]}") ## add it to sum
       if [[ $i -eq $((${#line[@]}-1)) ]]
       then
           echo "${line[0]} $sum" ##print sum
           sum=0
       fi
    done
    done < test.txt
    Output:
    ABC 24
    DEF 12
    

    【讨论】:

    • sum=$(expr "$sum" + "${arr[i]}") :给我一个错误。 sum=$((sum + arr[i])) :不起作用:/并且没有错误
    • 我修改了你的脚本。
    • 我不能使用那个 for 循环,我在编辑的问题中解释了原因。
    • for i in "${!line[@]}"; do for ((i=0; i &lt; ${#line}; i++))for ((i=0; i &lt; ${length}; i++)) 怎么样?也不要继续编辑带有附加要求的问题。
    • 问题不是循环,我成功地从索引 1 迭代到数组长度。这只是算术的问题。它不接受整数和数组字符串数字的相加。
    【解决方案2】:

    如果你想在 bash 中使用循环对文件的每一行中的数字求和,你可以这样做

    #!/bin/bash
    while read line; do
        array=($line);
        sum=0
        length=${#array[@]}
        for i in ${array[@]:0:$length}; do
           sum=$[$sum+$i]
        done
        echo $sum
    done < "$1"
    

    与您的代码不同的是i 是数组中的元素,而不是索引。

    但是,在 bash 中拥有文件相当慢。您可能最好在 awk 中完成任务,例如:

    awk '{s=0;for(i=1;i<=NF;i++) s+=$i;print s}' file
    

    【讨论】:

    • 我不能使用那个 for 循环,我在编辑的问题中解释了原因。
    • @Vaderico i 仍然是值,而不是索引。见编辑。另外,您的问题中有错字。它应该是 length=${#array[@]} 而不是 length=${#arr[@]}
    猜你喜欢
    • 2015-10-21
    • 2012-06-19
    • 1970-01-01
    • 2020-07-16
    • 2014-12-24
    • 2012-02-26
    • 2019-08-17
    • 2015-10-15
    • 2014-01-12
    相关资源
    最近更新 更多