Array Bash in profondità

Array Bash in profondità
In Bash, un array può essere un array indicizzato o un array associativo. Un array indicizzato è un elenco i cui elementi sono numerati a partire da zero. Un array associativo è un elenco in cui le stringhe hanno sostituito i numeri. Assumi una penna, un libro di allenamento, un libro di testo, un sovrano, $ 42 e una matita su una tabella di studio. Questi 6 elementi possono essere scritti come elenco, come segue:
  1. penna
  2. quaderno
  3. manuale
  4. governate
  5. 42
  6. matita

Questo è un esempio di un array indicizzato. Ci sono 6 articoli, ma gli articoli sono stati numerati da zero a 5. La numerazione in questo modo è indicizzare. Il conteggio dell'indice in bash inizia da zero e non 1.

Ognuno di questi prodotti è prodotto con un materiale principale. Un elenco del materiale principale, seguito dal suo prodotto finito, è:

inchiostro => penna
carta morbida => libro di allenamento
carta hard => libro di testo
plastica => righello
carta speciale => 42
legno => matita

Questo è un esempio di un array associativo. Non è sufficiente digitare questi array in un file bash. Uno dei diversi tipi di array deve essere codificato. La codifica di un array indicizzato è simile alla codifica di un array associativo. Tuttavia, ci sono differenze piccole ma importanti. Questo articolo dà uno sguardo approfondito in array di bash.

Contenuto dell'articolo

  • Array indicizzato
  • Array associativo
  • Conclusione

Array indicizzato

Creazione di un array indicizzato

Un modo per creare l'array sopra indicato è il seguente:

arr = (Pen 'Exercise Book "" Textbook "Ruler 42 Pencil)

Qui, arr è il nome dell'array. Il programmatore avrebbe potuto dare qualche altro nome. Gli spazi separano i diversi elementi nell'elenco degli array. Se un oggetto è costituito da più di una parola, viene digitato in singoli o doppi cittadini. L'indice per la penna è 0; L'indice del "libro di esercizi" è 1; L'indice per "libro di testo" è 2; L'indice per il sovrano è 3; L'indice per 42 è 4; L'indice per la matita è 5.

Un altro modo di creare l'array sopra inizia come segue:

arr [2] = "libro di testo"

Cioè, l'array viene creato, a cominciare da qualsiasi elemento nell'elenco. '2' tra parentesi quadrate è noto come un pedice. Gli altri elementi possono essere inclusi in seguito, come segue:

arr [0] = penna
arr [1] = "libro di allenamento"
arr [3] = sovrano
arr [4] = 42
arr [5] = matita

Si noti che nell'inclusione, l'articolo dell'indice 2 non è stato ripetuto.

Un altro modo di creare l'array sopra è il seguente:

dichiarare -a arr

Qui, "dichiarare" è una parola riservata. '-a' significa array indicizzato. "ARR" è il nome della scelta del programmatore. Tutti gli elementi possono quindi essere inclusi come segue:

arr [0] = penna
arr [1] = "libro di allenamento"
arr [2] = "libro di testo"
arr [3] = sovrano
arr [4] = 42
arr [5] = matita

Questa è inclusione per incarico. Ricorda, quando qualsiasi valore viene assegnato a una variabile, non dovrebbe esserci spazio tra l'operatore di assegnazione, = e la variabile o il valore.

Facendo riferimento all'elemento indicizzato

La sintassi per fare riferimento a un elemento è:

$ name [pedice]

Dove il nome è il nome dell'array, come arr. Il pedice è un numero intero (numero).

Indici positivi

Il conteggio dell'indice normalmente inizia da zero. Nel seguente codice, i valori degli elementi vengono letti e visualizzati:

arr = (Pen 'Exercise Book "" Textbook "Ruler 42 Pencil)
per ((i = 0; i < 6; ++i)); do
echo $ arr [i]
Fatto

L'output è:

penna
quaderno
manuale
governate
42
matita

Sei elementi stanno iniziando dall'indice zero all'indice 5. Quindi, l'iterazione viene eseguita 6 volte e non 5 volte.

Indici negativi

Gli indici negativi possono essere utilizzati per accedere agli elementi. In questo caso, -1 si riferisce all'ultimo elemento; -2 si riferisce all'ultimo ma uno elemento; -3 si riferisce all'elemento prima dell'ultimo elemento e così via. Quindi, per l'array sopra, -6 si riferisce al primo elemento. Il seguente codice illustra questo:

arr = (Pen 'Exercise Book "" Textbook "Ruler 42 Pencil)
per ((i = -1; i> = -6; --i)); Fare
echo $ arr [i]
Fatto

L'output è:

matita
42
governate
manuale
quaderno
penna

Il display è in ordine inverso.

Visualizzazione di tutti gli elementi in array indicizzato

Per visualizzare tutti gli elementi, può essere usato $ name [*] o $ name [@]. In queste espressioni, * o @ è al posto dell'indice. E con ciò, invece di restituire i valori degli elementi, vengono restituiti i valori degli elementi presenti nell'array. Il seguente codice illustra questo:

dichiarare -a arr
arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
echo $ arr [@]
echo $ arr [*]

L'output è,
Righello del libro di esercizi Pencil
Righello del libro di esercizi Pencil

Si noti che @ e * usati in questo modo sono sinonimi. C'è un problema con l'output: le frasi sono separate dagli spazi e non possono essere distinte. Il seguente codice dovrebbe separare le frasi con le virgole:

dichiarare -a arr
arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

L'output è ora:

Righello del libro di esercizi Pencil
libro di allenamento, sovrano, matita

IFS si intende separatore di campo interno. È stata assegnata una virgola. Nota l'uso di doppie citazioni per $ arr [@] e $ arr [*] nei comandi Echo. Le virgole sono state incluse per il sottoscrizione * e non per il pedice @. C'è ancora un altro problema: nella seconda linea di output, in cui sono state impiegate virgole, gli spazi non sono stati visualizzati. Quindi, @ e * non sono sempre sinonimi. Tuttavia, è possibile separarsi con virgola e spazio - vedi sotto.

Visualizzazione degli indici di array indicizzato

L'espressione, $ !nome [@] o $ !Nome [*] restituisce gli indici di un array come elenco, separato da spazi. Nota l'uso e la posizione del segno esclamativo (!). Il seguente codice mostra l'uso di queste espressioni:

arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
echo $ !arr [@]
echo $ !arr [*]

L'output è:
1 3 5
1 3 5

Lunghezza dell'array indicizzato

La lunghezza dell'array è data da:

$ #name [pedice]

Dove il nome è il nome come ARR, che il programmatore ha dato all'array; Il pedice è l'indice più alto (lunghezza - 1) per l'elemento il cui valore è impostato. Nota l'uso e la posizione del simbolo, #. Il seguente codice illustra questo:

arr = (Pen 'Exercise Book "" Textbook "Ruler 42 Pencil)
echo $ #arr [5]

L'output è 6. Anche se alcuni o tutti gli elementi inferiori non sono presenti, la lunghezza sarebbe comunque più alta_index + 1. Il seguente codice illustra questo:

dichiarare -a arr
arr [3] = sovrano
arr [5] = matita
echo $ #arr [5]

L'output è ancora 6, anche se nessun elemento è lì, per l'indice 0, l'indice 1, l'indice 2 e l'indice 4.

Numero di elementi di array indicizzato

Come visto sopra, il numero di elementi nell'array può essere inferiore alla lunghezza dell'array. Questo perché i valori di alcuni elementi al di sotto dell'ultimo elemento non sono stati creati o non sono stati inseriti. L'espressione fornisce il numero di elementi impostati in un array indicizzato, $ #arr [@] o $ #arr [*], come mostrato nel seguente codice:

arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
echo $ #arr [@]
echo $ #arr [*]

L'output è:

3
3

Visualizzazione solo elementi di impostato matrice indicizzata

Viene impostato un elemento indice assegnato un valore, mentre ciò che non viene assegnato un valore è unset. Il seguente codice visualizza solo i valori impostati:

arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
per ((i = 0; i < $#arr[5]; ++i)); do
Se [ ! -z "$ arr [i]"]; Poi
printf "$ arr [i],"
fi
Fatto
eco

L'output è:

libro di allenamento, sovrano, matita,

Nota come sono stati identificati ed eliminati gli elementi non accolti dall'iterazione nella condizione. Si noti inoltre che nella condizione, $ arr [i] è in doppia citazione come "$ arr [i]", in modo che i valori contenenti spazi possano essere stampati. Il comando printf è simile al comando echo ma non aggiunge una nuova riga dopo la visualizzazione. È stato possibile separare i valori all'uscita, con una virgola e uno spazio, in una linea. L'ultima eco avrebbe causato l'uscita successiva alla riga successiva.

Una forma più semplice del codice sopra è la seguente:

arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
Per I in $ !arr [@]; Fare
printf "$ arr [i],"
Fatto
eco

L'output è la stessa. Nota l'espressione per l'elenco dopo la parola riservata, in. Questa espressione restituisce l'elenco degli indici. Quindi non è necessario la condizione if qui.

Impostazione e intatta elementi indicizzati e il suo array

Qualsiasi elemento indicizzato a cui non è stato assegnato un valore è unset. È impostato un elemento indicizzato che ha un valore assegnato. Ora, un elemento può essere intenzionalmente insultato, come mostra il seguente script:

arr [1] = 'libro di allenamento' arr [3] = righello arr [5] = matita
UNSET ARR [3]
Per I in $ !arr [@]; Fare
printf "$ arr [i],"
Fatto
eco

L'output è:

libro di allenamento, matita,

Il "sovrano" non è stato visualizzato. La sintassi per non suonare un elemento è:

UNSET ArrayName [Sobbriposto]

La sintassi per rimuovere o sconfiggere l'intero array è:

Nome di Arrayset

O

Unset ArrayName [@]

O

Unset ArrayName [*]

Nel seguente codice, l'intero array è inserito:

arr = (Pen 'Exercise Book "" Textbook "Ruler 42 Pencil)
Unset ar
echo "$ arr [*]"

L'output non è nulla (una linea vuota) perché l'intero array è stato distoccato.

Array associativo

Come indicato sopra, un esempio di un array associativo scritto su carta, è:

inchiostro => penna
carta morbida => libro di allenamento
carta hard => libro di testo
plastica => righello
carta speciale => 42
legno => matita

Ci sono 6 elementi, ognuno composto da una coppia chiave/valore. Per il primo elemento, "inchiostro" è la chiave e la "penna" è il valore; Per il secondo elemento, la "carta soft" è la chiave e il "libro di esercizi" è il valore; e così via.

Creazione di un array associativo

Un modo per creare l'array sopra è il seguente:

dichiara -a arr = ([ink] = pen [paper soft] = 'libro di allenamento' [carta hard] = "libro di testo" [plastica] = righello [carta speciale] = 42 [legno] = matita)

Qui, arr è il nome dell'array. Il programmatore avrebbe potuto dare qualche altro nome. Gli spazi separano i diversi elementi nell'elenco degli array. Se un valore è costituito da più di una parola, viene digitato in singoli o doppi quote. Una chiave può consistere in più di una parola. Ci sono 6 coppie chiave/valore in questo array associativo codificato. Una chiave è posizionata tra parentesi quadrate. Il valore viene assegnato alla chiave, con l'operatore di assegnazione. '-A' significa array associativo e dovrebbe essere lì.

Un altro modo di creare l'array sopra inizia come segue:

dichiarare -a arr

Qui, "dichiarare" è una parola riservata. '-A' significa array associativo (mentre '-a' significa array indicizzato). "ARR" è il nome della scelta del programmatore. Gli elementi possono quindi essere inclusi come segue:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento'
arr [plastica] = righello
arr [legno] = matita

Tutti gli elementi (6) non dovrebbero necessariamente essere inclusi contemporaneamente. Il resto può essere aggiunto in seguito. Questo sta aggiungendo per assegnazione. Ricorda, quando qualsiasi valore viene assegnato a una variabile, non dovrebbe esserci spazio tra l'operatore di assegnazione, = e la variabile o il valore.

Fai riferimento all'elemento array associativo

La sintassi per fare riferimento a un elemento di array associativo è:

$ name [pedice]

Dove il nome è il nome dell'array, come arr. Il pedice è la chiave in forma di testo. Nel seguente codice, i valori degli elementi vengono letti e visualizzati:

dichiara -a arr = ([ink] = pen [paper soft] = 'libro di allenamento' [carta hard] = "libro di testo" [plastica] = righello [carta speciale] = 42 [legno] = matita)
echo $ arr [ink]
echo $ arr [soft paper]
echo $ arr [hard paper]
echo $ arr [plastica]
echo $ arr [Special Paper]
echo $ arr [wood]

L'output è:

penna
quaderno
manuale
governate
42
matita

Visualizzazione di tutti i valori nell'array associativo

Per visualizzare tutti i valori, può essere usato $ name [*] o $ name [@]. In queste espressioni, * o @ è al posto della chiave. E con ciò, invece di restituire i valori degli elementi, vengono restituiti i valori degli elementi presenti nell'array. Il seguente codice illustra questo:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento' arr [plastica] = righello arr [legno] = matita
echo $ arr [@]
echo $ arr [*]

L'output è,

sovrano del libro di esercizi di matita
sovrano del libro di esercizi di matita

L'ordine dei valori all'uscita non deve corrispondere all'ordine nell'array associativo. Si noti che @ e * usati in questo modo sono sinonimi. C'è un problema con l'output: le frasi sono separate dagli spazi e non possono essere distinte. Il seguente codice separa le frasi con virgole:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento' arr [plastica] = righello arr [legno] = matita
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

L'output è ora:

sovrano del libro di esercizi di matita
matita, libro d'esercizio fisico, sovrano

IFS si intende separatore di campo interno. È stata assegnata una virgola. Nota l'uso di doppie citazioni per $ arr [@] e $ arr [*] nei comandi Echo. Le virgole sono state incluse per il sottoscrizione * e non per il pedice @. C'è ancora un altro problema: nella seconda linea di output, in cui sono state impiegate virgole, gli spazi non sono stati visualizzati. Quindi, @ e * non sono sempre sinonimi. Bene, è possibile separarsi con virgola e spazio - vedi sotto.

Visualizzazione di tutte le chiavi dell'array associativo

L'espressione, $ !nome [@] o $ !Nome [*] restituisce le chiavi di un array come elenco, separati da spazi. Nota l'uso e la posizione del segno esclamativo (!). Il seguente codice mostra l'uso di queste espressioni:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento' arr [plastica] = righello arr [legno] = matita
echo $ !arr [@]
echo $ !arr [*]

L'output è:

Plastica di carta morbida in legno
Plastica di carta morbida in legno

L'ordine delle chiavi dell'array associativo non deve essere lo stesso di dichiarato nell'array.

Numero di elementi di array associativo

L'espressione fornisce il numero di elementi impostati in un array associativo, $ #arr [@] o $ #arr [*], come mostrato nel seguente codice:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento' arr [plastica] = righello arr [legno] = matita
echo $ #arr [@]
echo $ #arr [*]

L'output è:

3
3

Nota l'uso e la posizione del simbolo, #.

Visualizzazione solo elementi di impostato dell'array associativo

Viene impostato un elemento chiave assegnato un valore, mentre ciò che non viene assegnato un valore è unset. Il seguente codice visualizza solo i valori impostati:

dichiarare -a arr
arr [ink] = penna
$ arr [soft paper]; arr [carta soft] = 'libro di allenamento'
$ arr [hard paper]
arr [plastica] = righello
$ arr [carta speciale]
arr [legno] = matita
per la chiave in "$ !arr [@] "; do
printf "$ arr [$ key],"
Fatto
eco

L'output è:

matita, libro d'esercizio fisico, penna, sovrano,

Ancora una volta, il posizionamento dell'uscita non è nell'ordine codificato. Si noti che “$ !arr [@] "è in doppio quote in modo che i valori contenenti spazi possano essere stampati. Si noti che in $ arr [$ key], la chiave è preceduta da $. Il comando printf è simile al comando echo ma non aggiunge una nuova riga dopo la visualizzazione. È stato possibile separare i valori all'uscita, con una virgola e uno spazio, in una linea. L'ultima eco avrebbe causato l'uscita successiva alla riga successiva.

Elementi di array associativi di impostazione e inarrestabile e il suo array

Qualsiasi elemento chiave a cui non è stato assegnato un valore è unset. È impostato un elemento chiave che ha un valore assegnato. Ora, un elemento può essere intenzionalmente insultato, come mostra il seguente script:

dichiarare -a arr
arr [carta soft] = 'libro di allenamento' arr [plastica] = righello arr [legno] = matita
UNSET ARR [plastica]
per la chiave in "$ !arr [@] "; do
printf "$ arr [$ key],"
Fatto
eco

L'output è:

matita, libro di allenamento,

Il "sovrano" non è stato visualizzato. La sintassi per non suonare un elemento è:

Unset ArrayName [Key]

La sintassi per rimuovere o sconfiggere l'intero array associativo è:

Nome di Arrayset

O

Unset ArrayName [@]

O

Unset ArrayName [*]

Nel seguente codice, l'intero array è inserito:

dichiara -a arr = ([ink] = pen [paper soft] = 'libro di allenamento' [carta hard] = "libro di testo" [plastica] = righello [carta speciale] = 42 [legno] = matita)
Unset ar
echo "$ arr [*]"

L'output non è nulla (una linea vuota) perché l'intero array è stato sconvolto.

Visualizzazione dei valori di un array associato

Visualizzazione dei valori di un array associato

dichiara -a arr = ([ink] = pen [paper soft] = 'libro di allenamento' [carta hard] = "libro di testo" [plastica] = righello [carta speciale] = 42 [legno] = matita)
per valore in "$ arr [@]"; Fare
Echo $ Value
Fatto

L'output è:

matita
42
quaderno
manuale
penna
governate

Ancora una volta, l'ordine in cui i valori sono codificati in un array associativo non deve essere l'ordine in cui vengono visualizzati. Si noti che @ è stato usato al posto di * per la variabile dell'elenco. Inoltre, sono state utilizzate doppie citazioni per la variabile dell'elenco.

Conclusione

Un array è un elenco, numerato o chiave. Quando l'array è numerato, è un array indicizzato. Quando i valori si trovano per chiavi, è un array associativo. Con l'array indicizzato, la numerazione inizia da zero. Nel calcolo, l'array deve essere codificato. Il programmatore deve sapere come creare l'array. Deve sapere come aggiungere elementi all'array ed eliminare elementi dall'array. Deve essere in grado di determinare il numero di elementi nell'array. E ha bisogno di sapere come eliminare l'array.