所以我学习bash并且需要通过调用函数来做一个简单的脚本来乘以数组元素。
到目前为止我的代码是这样的,但它根本不起作用。我相信有一个比这更简单的方法(递增echo $row['st_id'], " " , $row['em_name'], " ", $row['st_bday'], "", $row['st_emirate'] , "", $row['em_id'], " ", $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
替换为+
而无法正常工作}。
答案 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 '*') ))
}
这使用算术表达式来计算printf
和paste
的输出(现在是命令替换),但可读性有点受损。
或者,在纯粹的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