乘以数组元素

时间:2016-09-28 21:36:27

标签: arrays bash shell multiplication

所以我学习bash并且需要通过调用函数来做一个简单的脚本来乘以数组元素。

到目前为止我的代码是这样的,但它根本不起作用。我相信有一个比这更简单的方法(递增echo $row['st_id'], "&nbsp;&nbsp;" , $row['em_name'], " ", $row['st_bday'], "", $row['st_emirate'] , "", $row['em_id'], "&nbsp;", $row['em_name'],'<br />'; 变量以便移动到下一个数组元素感觉完全错误)。

pos

我尽力去解决问题,但无法找到任何相关信息,我找到了如何使用bc求和,但它只是将array=(1 2 3 4 5 100) sum=0 pos=1 function multiplicate { for i in ${array[*]};do sum=$(($i * $array[pos])) let pos++ done } multiplicate echo $sum 替换为+而无法正常工作}。

2 个答案:

答案 0 :(得分:3)

以下是使用bc的方法:

multiply ()
{
    printf '%s\n' "$@" | paste -s -d '*' | bc
}

使用如下:

$ multiply 1 2 3 4 5 100
12000

管道中的第一个命令在单独的行上打印每个数组元素:

$ printf '%s\n' 1 2 3 4 5 100
1
2
3
4
5
100

paste -s(&#34; serial&#34;)然后再次将输出转换为单行,但元素现在由*分隔:

$ printf '%s\n' 1 2 3 4 5 100 | paste -s -d '*'
1*2*3*4*5*100

bc最终评估表达式。

或者,我们可以保存子shell并跳过bc

multiply () {
    echo $(( $(printf '%s\n' "$@" | paste -s -d '*') ))
}

这使用算术表达式来计算printfpaste的输出(现在是命令替换),但可读性有点受损。

或者,在纯粹的Bash(帽子提示sorontar)中:

multiply () {
    local IFS='*'
    echo "$(( $* ))"
}

这会将字段分隔符IFS设置为*,因此参数$*会扩展为由*分隔的字符串,然后在算术表达式{中计算{ {1}}。

答案 1 :(得分:2)

使用此脚本:

#!/bin/bash
array=(1 2 3 4 5 100)

function multiplicate {
    local mul=1
    for i in "${array[@]}"; do
        ((mul *= i))
    done
    echo "$mul"
}

multiplicate


$ ./script
12000

或者更好:

#!/bin/bash

multiplicate() {
    local  mul=1
    for    i
    do     ((mul *= i))
    done
    echo   "$mul"
}

multiplicate 1 2 3 4 5 100

如果你喜欢使用字符串变量,请使用:

multiplicate() { local IFS=* ; echo $(( $* )); }

multiplicate 1 2 3 4 5 100