web-dev-qa-db-fra.com

Comment copier un tableau dans Bash?

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.

46
Kyle R.
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   
91
user1088530

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.

20
niieani

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
5
Isaac Schwabacher

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
2
Steven Penny

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 .

1
imp25

Essayez ceci: arrayClone=("${oldArray[@]}")

Cela fonctionne facilement.

0
maheshk

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
}
0
Hiro