Ricerca…


Assegnazioni di array

Assegnazione lista

Se hai familiarità con Perl, C o Java, potresti pensare che Bash userebbe le virgole per separare gli elementi dell'array, tuttavia non è questo il caso; invece, Bash utilizza gli spazi:

 # Array in Perl
 my @array = (1, 2, 3, 4);
 # Array in Bash
 array=(1 2 3 4)

Crea una matrice con nuovi elementi:

array=('first element' 'second element' 'third element')

Assegnazione di pedici

Crea una matrice con indici di elementi espliciti:

array=([3]='fourth element' [4]='fifth element')

Assegnazione per indice

array[0]='first element'
array[1]='second element'

Assegnazione per nome (array associativo)

4.0
declare -A array
array[first]='First element'
array[second]='Second element'

Assegnazione dinamica

Crea una matrice dall'output di un altro comando, ad esempio usa seq per ottenere un intervallo da 1 a 10:

array=(`seq 1 10`)

Assegnazione dagli argomenti di input dello script:

array=("$@")

Assegnazione all'interno di loop:

while read -r; do
    #array+=("$REPLY")     # Array append
    array[$i]="$REPLY"     # Assignment by index
    let i++                # Increment index 
done < <(seq 1 10)  # command substitution
echo ${array[@]}    # output: 1 2 3 4 5 6 7 8 9 10

dove $REPLY è sempre l'input corrente

Accesso agli elementi dell'array

Stampa elemento all'indice 0

echo "${array[0]}"
4.3

Stampa l'ultimo elemento usando la sintassi di espansione della sottostringa

echo "${arr[@]: -1 }"
4.3

Stampa l'ultimo elemento usando la sintassi del pedice

echo "${array[-1]}"

Stampa tutti gli elementi, ciascuno quotato separatamente

echo "${array[@]}"

Stampa tutti gli elementi come una singola stringa tra virgolette

echo "${array[*]}"

Stampa tutti gli elementi dall'indice 1, ciascuno quotato separatamente

echo "${array[@]:1}"

Stampa 3 elementi dall'indice 1, ciascuno quotato separatamente

echo "${array[@]:1:3}"

Operazioni su stringhe

Se ci si riferisce a un singolo elemento, le operazioni con le stringhe sono consentite:

array=(zero one two)
echo "${array[0]:0:3}" # gives out zer (chars at position 0, 1 and 2 in the string zero)
echo "${array[0]:1:3}" # gives out ero (chars at position 1, 2 and 3 in the string zero)

così ${array[$i]:N:M} emette una stringa dal N ° posizione (partendo da 0) nella stringa ${array[$i]} con M seguenti caratteri.

Lunghezza della matrice

${#array[@]} fornisce la lunghezza dell'array ${array[@]} :

array=('first element' 'second element' 'third element')
echo "${#array[@]}" # gives out a length of 3

Funziona anche con le stringhe in singoli elementi:

echo "${#array[0]}"    # gives out the lenght of the string at element 0: 13

Modifica delle matrici

Cambia indice

Inizializza o aggiorna un particolare elemento nell'array

array[10]="elevenths element"    # because it's starting with 0
3.1

Aggiungere

Modifica array, aggiungendo elementi alla fine se non viene specificato alcun indice.

array+=('fourth element' 'fifth element')

Sostituisci l'intero array con un nuovo elenco di parametri.

array=("${array[@]}" "fourth element" "fifth element")

Aggiungi un elemento all'inizio:

array=("new element" "${array[@]}")

Inserire

Inserisci un elemento in un dato indice:

arr=(a b c d)
# insert an element at index 2
i=2
arr=("${arr[@]:0:$i}" 'new' "${arr[@]:$i}")
echo "${arr[2]}" #output: new

Elimina

Elimina gli indici di array usando il builtin unset :

arr=(a b c)
echo "${arr[@]}"   # outputs: a b c
echo "${!arr[@]}"  # outputs: 0 1 2
unset -v 'arr[1]'
echo "${arr[@]}"   # outputs: a c
echo "${!arr[@]}"  # outputs: 0 2

fondersi

array3=("${array1[@]}" "${array2[@]}")

Questo funziona anche per gli array sparsi.

Reindicizzazione di un array

Questo può essere utile se gli elementi sono stati rimossi da un array o se non si è sicuri se ci siano lacune nell'array. Per ricreare gli indici senza spazi vuoti:

array=("${array[@]}")

Array Iteration

L'iterazione dell'array è disponibile in due versioni, foreach e il classico ciclo for:

a=(1 2 3 4)
# foreach loop
for y in "${a[@]}"; do
    # act on $y
    echo "$y"
done
# classic for-loop
for ((idx=0; idx < ${#a[@]}; ++idx)); do
    # act on ${a[$idx]}
    echo "${a[$idx]}"
done

Puoi anche eseguire iterazioni sull'output di un comando:

a=($(tr ',' ' ' <<<"a,b,c,d")) # tr can transform one character to another
for y in "${a[@]}"; do
    echo "$y"
done

Distruggi, elimina o disattiva una matrice

Per distruggere, eliminare o rimuovere un array:

unset array

Per distruggere, eliminare o rimuovere un singolo elemento dell'array:

unset array[10]

Array associativi

4.0

Dichiara un array associativo

declare -A aa 

Dichiarare un array associativo prima dell'inizializzazione o dell'uso è obbligatorio.

Inizializza elementi

È possibile inizializzare gli elementi uno alla volta come segue:

aa[hello]=world
aa[ab]=cd
aa["key with space"]="hello world"

È inoltre possibile inizializzare un intero array associativo in una singola istruzione:

aa=([hello]=world [ab]=cd ["key with space"]="hello world")

Accedi ad un elemento di array associativo

echo ${aa[hello]}
# Out: world

Elenco delle chiavi di un array associativo

echo "${!aa[@]}"
#Out: hello ab key with space

Elenco dei valori degli array associativi

echo "${aa[@]}"
#Out: world cd hello world

Iterare su chiavi e valori di array associativi

for key in "${!aa[@]}"; do
    echo "Key:   ${key}"
    echo "Value: ${array[$key]}"
done

# Out:
# Key:   hello
# Value: world
# Key:   ab
# Value: cd
# Key:   key with space
# Value: hello world

Contare gli elementi dell'array associativo

echo "${#aa[@]}"
# Out: 3

Elenco di indici inizializzati

Ottieni l'elenco degli indici inializzati in un array

$ arr[2]='second'
$ arr[10]='tenth'
$ arr[25]='twenty five'
$ echo ${!arr[@]}
2 10 25

Looping attraverso una matrice

La nostra matrice di esempio:

arr=(a b c d e f)

Utilizzando un ciclo for..in :

for i in "${arr[@]}"; do
    echo "$i"
done
2.04

Uso di C-style for loop:

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

Uso del ciclo while :

i=0
while [ $i -lt ${#arr[@]} ]; do
    echo "${arr[$i]}"
    i=$((i + 1))
done
2.04

Uso del ciclo while con condizionale numerico:

i=0
while (( $i < ${#arr[@]} )); do
    echo "${arr[$i]}"
    ((i++))
done

L'utilizzo di un until ad anello:

i=0
until [ $i -ge ${#arr[@]} ]; do
    echo "${arr[$i]}"
    i=$((i + 1))
done
2.04

Utilizzando un until ciclo condizionale numerica:

i=0
until (( $i >= ${#arr[@]} )); do
    echo "${arr[$i]}"
    ((i++))
done

Matrice da stringa

stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })

Ogni spazio nella stringa denota un nuovo elemento nella matrice risultante.

echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[3]} # will print Mango

Allo stesso modo, altri caratteri possono essere utilizzati per il delimitatore.

stringVar="Apple+Orange+Banana+Mango"
arrayVar=(${stringVar//+/ })
echo ${arrayVar[0]} # will print Apple
echo ${arrayVar[2]} # will print Banana

Funzione di inserimento di array

Questa funzione inserirà un elemento in una matrice in un dato indice:

insert(){
    h='
################## insert ########################
# Usage:
#   insert arr_name index element
#
#   Parameters:
#       arr_name    : Name of the array variable
#       index       : Index to insert at
#       element     : Element to insert
##################################################
    '
    [[ $1 = -h ]] && { echo "$h" >/dev/stderr; return 1; }
    declare -n __arr__=$1   # reference to the array variable
    i=$2                    # index to insert at
    el="$3"                 # element to insert
    # handle errors
    [[ ! "$i" =~ ^[0-9]+$ ]] && { echo "E: insert: index must be a valid integer" >/dev/stderr; return 1; }
    (( $1 < 0 )) && { echo "E: insert: index can not be negative" >/dev/stderr; return 1; }
    # Now insert $el at $i
    __arr__=("${__arr__[@]:0:$i}" "$el" "${__arr__[@]:$i}")
}

Uso:

insert array_variable_name index element

Esempio:

arr=(a b c d)
echo "${arr[2]}" # output: c
# Now call the insert function and pass the array variable name,
# index to insert at
# and the element to insert
insert arr 2 'New Element'
# 'New Element' was inserted at index 2 in arr, now print them
echo "${arr[2]}" # output: New Element
echo "${arr[3]}" # output: c

Lettura di un intero file in un array

Leggere in un unico passaggio:

IFS=$'\n' read -r -a arr < file

Lettura in loop:

arr=()
while IFS= read -r line; do
  arr+=("$line")
done
4.0

Usando mapfile o readarray (che sono sinonimi):

mapfile -t arr < file
readarray -t arr < file


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow