BASH 数组中所有元素的算术运算
Arithmetic operation on all elements in BASH array
假设我们有一个 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 算术是否支持对每个数组元素进行此类批处理操作。
你可以使用 eval 来感受 lambda 函数(语法不太清楚,但这应该是主要思想):
eval "function add1 { x=; y=$((x+1)) ; return $y; }"
for (( i=0 ; i<=${#arr[@]}-1 ; i++ )) ; do
add1 ${arr[i]}
done
我知道你的问题不是新鲜的,但你可以通过将数组声明为 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
假设我们有一个 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 算术是否支持对每个数组元素进行此类批处理操作。
你可以使用 eval 来感受 lambda 函数(语法不太清楚,但这应该是主要思想):
eval "function add1 { x=; y=$((x+1)) ; return $y; }"
for (( i=0 ; i<=${#arr[@]}-1 ; i++ )) ; do
add1 ${arr[i]}
done
我知道你的问题不是新鲜的,但你可以通过将数组声明为 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