J'ai un tableau contenant certains éléments, mais je veux pousser de nouveaux éléments au début du tableau; Comment je fais ça?
arr=("new_element" "${arr[@]}")
En général, vous le feriez.
arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")
arr=( "${arr[@]}" "new_element" )
Ou à la place
arr+=( "new_element" )
En général, vous le feriez.
arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )
Disons que nous voulons ajouter un élément à la position de Index2 arr [2], nous ferions en fait fusionner les sous-tableaux ci-dessous:
Récupère tous les éléments avec Index position2 au dernier arr [2], arr [3], ....
arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )
En plus de supprimer un élément d'un tableau (disons l'élément # 3), nous devons concaténer deux sous-tableaux. Le premier sous-tableau contiendra les éléments avant l'élément # 3 et le second sous-tableau contiendra les éléments après l'élément # 3.
arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
${arr[@]:0:2}
obtiendra deux éléments arr [0] et arr [1] commence au début du tableau.${arr[@]:3}
obtiendra tous les éléments de l'index3 arr [3] au dernier.
une manière pratique possible de reconstruire l'arr en excluant l'élément # 3 (arr [2]) à partir de cela:
del_element=3; arr=( "${arr[@]:0:$((del_element-1))}" "${arr[@]:$del_element}" )
spécifiez l'élément que vous souhaitez exclure dans del_element=
.
Une autre possibilité de supprimer un élément est
Utilisation de unset
(attribue en fait la valeur 'null' à l'élément)
unset -v 'arr[2]'
Utilisez replace pattern si vous connaissez la valeur de vos éléments de tableau pour tronquer leur valeur (remplacez-la par une chaîne vide).
arr=( "${arr[@]/PATTERN/}" )
printf '%s\n' "${arr[@]}"
Notez que les tableaux dans bash
(copiés depuis ksh) sont des tableaux plutôt associatifs.
a=(newvalue "$a[@]")
ferait un nouveau $a
tableau avec newvalue
comme ${a[0]}
et les éléments du tableau d'origine ajoutés dans l'ordre numérique de leur clé avec les touches 1, 2 ...
Par exemple, si vous aviez:
bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")
Cela explique pourquoi il n'y a pas d'opérateur intégré pour cela.
Si vous vouliez insérer le newvalue
comme ${a[0]}
et décaler toutes les autres clés par une, vous auriez besoin d'un tableau temporaire:
b=newvalue
for k in "${!a[@]}"; do
b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
a[k]=${b[k]}
done
unset b
Les shells comme zsh
ou yash
qui ont des tableaux normaux ont des opérateurs pour cela:
zsh
:
a[1,0]=newvalue
(fonctionne également pour ajouter des chaînes aux variables scalaires)
yash
:
array -i a 0 newvalue
# array declaration
arr=()
#Function to read data from file a and add into array
fun_add_in_array()
{
input=$1
while IFS=',' read -r f1 f2
do
echo "Element1 : $f1"
echo "Element2 : $f2"
arr+=( "$f1" )
done < "$input"
}
#Function to print a array
fun_read_array()
{
arr=("$@")
for i in "${arr[@]}"
do
echo $i
done
}
Créer un tableau indexé:
$ declare -a A
$ declare -p A
déclarer -a A
Ajoutez quelques éléments au tableau:
$ A+=(foo)
$ A+=(bar)
$ A+=("baz quux")
$ declare -p A
déclarer -a A = ([0] = "foo" [1] = "bar" [2] = "baz quux")
Supprimez l'élément du milieu, ce qui en fait un tableau indexé clairsemé:
$ unset A[1]
$ declare -p A
déclarer -a A = ([0] = "foo" [2] = "baz quux")
Supprimez le dernier élément du tableau indexé clairsemé:
$ unset A[-1]
$ declare -p A
déclarer -a A = ([0] = "foo")