Cosa significa $ {@: 2} negli script di shell


27

Vedo questo in uno script di shell.

variable=${@:2}

Cosa sta facendo?


È esattamente così che è stato mostrato nella sceneggiatura? La sintassi sembra un array ma mancano alcuni pezzi. Puoi per favore pubblicare un paio di righe attorno a questa riga della sceneggiatura?
slm

Questa è una variabile a partire dalla seconda lettera. var="my_value"; echo var="${var[@]:2}"; echo "$var"Vedi la differenza?
Valentin Bajrami,

Risposte:


34

Sta mostrando il contenuto della variabile speciale $@, in Bash. Esso contiene tutti gli argomenti della linea di comando, e questo comando sta prendendo tutti gli argomenti dal secondo uno e loro memorizzazione in una variabile, variable.

Esempio

Ecco una sceneggiatura esemplificativa.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Esempio di esecuzione:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Riferimenti


9
Si noti che la tecnica mostrata combina gli argomenti dati in una singola stringa. Se devi tenerli come argomenti separati, usa un array:vars=( "${@:2}" )
glenn jackman,

@glennjackman - grazie per averlo segnalato.
slm

2
Si noti inoltre l'uso delle parentesi graffe. Dovresti usare sempre parentesi graffe, ma Bash ti consente di ometterle quando il contesto non è ambiguo. Pertanto, $@e ${@}sono identici, sebbene quest'ultima sia la sintassi "più corretta". Devi usare le parentesi con ${@:2}, perché $@:2è ambiguo e sarebbe quindi interpretato come ${@}:2, che non è la stessa cosa.
Paddy Landau,

14

Questa è una kshfunzionalità presente anche nelle bashversioni recenti di zsh.

In kshe bash, è possibile accedere a più elementi di un array usando la ${array[@]:first:length}sintassi, che si espande fino a length(o tutti se lengthviene omesso) elementi arraydell'array (nell'elenco di elementi dell'array ordinati numericamente sugli indici), iniziando con il primo con indice maggiore o uguale a first. Quando nel contesto scalare (come qui in un'assegnazione a una variabile scalare) l'elenco di elementi è unito con caratteri spazio con bashe ksh93con il primo carattere di $IFS(o nulla se $IFSè vuoto o se è impostato) con zsh.

Per esempio:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@è un caso speciale. $@è l'array di parametri posizionali ( $1, $2...). Ma se utilizzato con :, $0è anche incluso. Quindi ${@:1}è lo stesso $@, non ${@:0}come per gli altri array.

In zsh, è leggermente diverso. zshaggiunta la kshsintassi solo di recente per compatibilità, ma ha una sua sintassi per la selezione di intervalli di elementi.

Contrariamente a kshe bash, le zshmatrici sono di tipo variabile diverso dalle variabili scalari, non sono sparse ( zshha matrici associative come altro tipo di variabile) e iniziano con l'indice 1 anziché 0.

Per zsh, si accede agli intervalli di elementi dell'array con $a[first,last](dove lastpuò anche essere negativo per contare all'indietro dalla fine).

In zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

crea un array con 235 elementi, molti dei quali vuoti. $a[12,50]si espanderebbe agli elementi da 12 a 50 e ${a[@]:12:2}si espanderebbe solo agli (vuoti) $a[12]e agli $a[13]elementi. Come caso speciale, e ancora per portabilità con ksh93e bash, zshaccetta anche un 0primo elemento $@e lo considera come $0.

Pertanto, è possibile utilizzare ${a[@]:x:n}e ${@:x:n}trasportare tutte e 3 le shell, ma solo per array non sparsi e prestare attenzione al valore di IFS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.