J'ai un éventail d'applications, initialisées comme ceci:
depends=$(cat ~/Depends.txt)
Lorsque j'essaie d'analyser la liste et de la copier dans un nouveau tableau à l'aide de,
for i in "${depends[@]}"; do
if [ $i #isn't installed ]; then
newDepends+=("$i")
fi
done
Ce qui se passe, c'est que seul le premier élément de dépend se termine sur newDepends.
for i in "${newDepends[@]}"; do
echo $i
done
^^ Cela ne produirait qu'une seule chose. J'essaie donc de comprendre pourquoi ma boucle for ne déplace que le premier élément. La liste entière est à l'origine dépend, donc ce n'est pas ça, mais je suis à court d'idées.
a=(foo bar "foo 1" "bar two") #create an array
b=("${a[@]}") #copy the array in another one
for value in "${b[@]}" ; do #print the new array
echo "$value"
done
La façon la plus simple de copier un tableau non associatif dans bash est de:
arrayClone=("${oldArray[@]}")
ou pour ajouter des éléments à un tableau préexistant:
someArray+=("${oldArray[@]}")
Les sauts de ligne/espaces/IFS dans les éléments seront conservés.
Pour copier des tableaux associatifs, les solutions d'Isaac fonctionnent très bien.
Les solutions données dans les autres réponses ne fonctionneront pas pour les tableaux associatifs, ou pour les tableaux avec des indices non contigus. Voici une solution plus générale:
declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!')
temp=$(declare -p arr)
eval "${temp/arr=/newarr=}"
diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/')
# no output
Et un autre:
declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!')
declare -A newarr
for idx in "${!arr[@]}"; do
newarr[$idx]=${arr[$idx]}
done
diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/')
# no output
En commençant par Bash 4. , vous pouvez le faire
$ alpha=(bravo charlie 'delta 3' '' foxtrot)
$ declare -n golf=alpha
$ echo "${golf[2]}"
delta 3
Vous pouvez copier un tableau en insérant les éléments du premier tableau dans la copie en spécifiant l'index:
#!/bin/bash
array=( One Two Three Go! );
array_copy( );
let j=0;
for (( i=0; i<${#array[@]}; i++)
do
if [[ $i -ne 1 ]]; then # change the test here to your 'isn't installed' test
array_copy[$j]="${array[$i]}
let i+=1;
fi
done
for k in "${array_copy[@]}"; do
echo $k
done
La sortie de ceci serait:
One
Three
Go!
Un document utile sur les tableaux bash est sur TLDP .
Essayez ceci: arrayClone=("${oldArray[@]}")
Cela fonctionne facilement.
Le problème est de copier le tableau dans la fonction pour être visible dans le code parent. Cette solution fonctionne pour les tableaux indexés et si, avant la copie, ils sont prédéfinis comme declare -A ARRAY
, fonctionne également pour les tableaux associatifs.
function array_copy
# $1 original array name
# $2 new array name with the same content
{
local INDEX
for INDEX in $(eval echo "\${!$1[@]}")
do
eval "$2[\"$INDEX\"]=\"\${$1[$INDEX]}\""
done
}