[英]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算術是否支持每個數組元素上的此類批處理操作。
我知道您的問題不是新鮮事物,但是您可以通過將數組聲明為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
您可以使用eval來感受lambda函數(不確定語法,但這應該是主要思想):
eval "function add1 { x=$1; y=$((x+1)) ; return $y; }"
for (( i=0 ; i<=${#arr[@]}-1 ; i++ )) ; do
add1 ${arr[i]}
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.