对BASH数组中所有元素的算术运算

时间:2015-07-30 07:50:09

标签: arrays bash arithmetic-expressions

假设我们有一个带整数的BASH数组:

declare -a arr=( 1 2 3 )

我想对每个元素进行算术运算,例如添加1. for循环是否有替代:

for (( i=0 ; i<=${#arr[@]}-1 ; i++ )) ; do
    arr[$i]=$(( ${arr[$i]} + 1 ))
done

我尝试过几个选项:

arr=$(( ${arr[@]} + 1 ))

失败,而

arr=$(( $arr + 1 ))

结果

echo ${arr[@]}
2 2 3

因此只改变了第一个(第零个)元素。

我阅读了awk解决方案,但想知道BASH算术是否支持每个数组元素上的批处理操作。

2 个答案:

答案 0 :(得分:2)

我知道您的问题不是新鲜事,但您可以通过将数组声明为integer然后应用替换来完成您想要的操作:

declare -ia arr=( 1 2 3 )
value=1

declare -ia 'arr_added=( "${arr[@]/%/+$value}" )'
echo "arr_added: ${arr_added[*]}"

value=42
declare -ia 'arr_added=( "${arr[@]/%/+$value}" )'
echo "arr_added: ${arr_added[*]}"

输出:

arr_added: 2 3 4
arr_added: 43 44 45

您也可以执行其他数学运算:

value=3
declare -ia 'arr_multd=( "${arr[@]/%/*$value}" )'
echo "arr_multd: ${arr_multd[*]}"

输出:

arr_multd: 3 6 9

答案 1 :(得分:-1)

你可以使用eval来感受lambda函数(不确定语法,但这应该是主要的想法):

eval "function add1 { x=$1; y=$((x+1)) ; return $y; }"
for (( i=0 ; i<=${#arr[@]}-1 ; i++ )) ; do
    add1 ${arr[i]}
done