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

Arrays BASH数组中所有元素的算术运算,arrays,bash,arithmetic-expressions,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 )) 导致 echo ${arr[@]} 2 2 3 因此,只有第一个(第零个)元素被更改 我阅读了有关awk的解决方

假设我们有一个带整数的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 ))
导致

echo ${arr[@]}
2 2 3
因此,只有第一个(第零个)元素被更改


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

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

eval“函数add1{x=$1;y=$((x+1));返回$y;}”

对于((i=0;i我知道您的问题并不新鲜,但您可以通过将数组声明为
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

我认为没有其他选择。顺便说一句,我使用的编程语言中没有一种能够在本地实现这一点。此外,您可以将
arr[$I]=$(${arr[$I]}+1))
简化为
arr[$I]+
我不知道您喜欢的语言,但例如FORTRAN确实支持
arr(:)=arr(:)+1
arr3(:)=arr1(:)*arr2(:)
,所以我希望BASH能够。对不起,我无法复制
arr[$I]+
的东西。想解释一下吗?忘记括号了。正确的语法是
($arr[$I]+))
如果有函数的话,shell只会在后台循环。因此,如果它困扰您,只需编写您自己的函数即可。@Plutox抱歉,仍然无法复制,您能否明确地将for循环从开始到结束写入?提前谢了。我认为这并不能回答问题。OP希望避免for循环交替,而我也是这是对
eval
的毫无意义的使用,因为参数扩展将在函数定义之前展开。
return
用于返回退出状态,而不是计算。谢谢-在我的测试中,也可以不使用引号,例如gg
declare-ia new_arr=(${arr[@])/%/+$value}
。有关于此的文档吗?我在
man bash
中没有看到它。是的,数组文档中没有直接提到
-I
,无论是在任何手册页还是TLDP或类似的文档中。您可以在“键入变量:声明或排版”中检查
-I
[。它适用于任何变量,包括数组。
value=3
declare -ia 'arr_multd=( "${arr[@]/%/*$value}" )'
echo "arr_multd: ${arr_multd[*]}"
arr_multd: 3 6 9