2015-07-30 1 views
1

Disons que nous avons un tableau de BASH avec des entiers:opération arithmétique sur tous les éléments dans le tableau BASH

declare -a arr=(1 2 3) 

et je veux faire une opération arithmétique sur chaque élément, par exemple ajouter 1. Y at-il un altenative à une boucle:

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

J'ai essayé quelques options:

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

échoue, alors que

arr=$(($arr + 1)) 

résultats dans

echo ${arr[@]} 
2 2 3 

donc seulement le premier (zeroth) ele ment modifié. J'ai lu environ awk solutions, mais je voudrais savoir si l'arithmétique BASH supporte de telles opérations par lots sur chaque élément de la matrice.

+2

Je ne pense pas qu'il y ait une alternative. En guise de remarque, aucun des langages de programmation que j'utilise ne le fait nativement. Aussi, vous pouvez simplifier 'arr [$ i] = $ (($ {arr [$ i]} + 1))' à 'arr [$ i] ++' – Aserre

+1

Je ne connais pas vos langues préférées, mais par ex. FORTRAN supporte 'arr (:) = arr (:) + 1' ou' arr3 (:) = arr1 (:) * arr2 (:) ', donc j'avais l'espoir que BASH serait capable. Désolé, je ne peux pas reproduire la chose 'arr [$ i] ++'. Soin d'expliquer? – Fiximan

+1

oublié la parenthèse. la syntaxe correcte est '(($ arr [$ i] ++))' – Aserre

Répondre

1

Je sais que votre question n'est pas frais nouveau, mais vous pouvez accomplir ce que vous voulez en déclarant votre tableau comme integer, puis en appliquant une substitution:

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[*]}" 

Il produit:

arr_added: 2 3 4 
arr_added: 43 44 45 

Vous pouvez effectuer d'autres opérations mathématiques ainsi:

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

Sorties:

arr_multd: 3 6 9 
+1

Merci - dans mes tests fonctionne également sans utiliser de guillemets, par exemple 'declare -ia new_arr = ($ {arr [@]} /%/+ $ value}'. Y at-il de la documentation à ce sujet? Je n'ai pas voyez-le dans 'man bash' – Fiximan

+0

Oui, il n'y a pas de mention directe pour' -i' dans la documentation de tableau ni dans une page de manuel, ni dans TLDP ou similaire.Vous pouvez vérifier '-i', bien que dans" Typing variables: declare or typet "[http://tldp.org/LDP/abs/html/declareref.html]. Cela fonctionne pour n'importe quelle variable, y compris les tableaux. – j4x

-1

vous pouvez utiliser eval pour avoir le sentiment de la fonction lambda (pas sûr de la syntaxe, mais cela devrait être l'idée principale):

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

Je ne pense pas que cela réponde à la question. OP veut éviter complètement une boucle for – Aserre

+0

C'est aussi une utilisation inutile de 'eval', puisque les expansions des paramètres seront étendues avant que la fonction ne soit définie. 'return' est utilisé pour renvoyer un statut de sortie, pas un calcul. – chepner