Vidím to ve skriptu prostředí.
variable=${@:2}
Co to dělá?
Komentáře
Odpovědět
Je to zobrazení obsahu speciální proměnné $@
v Bashi. Obsahuje všechny argumenty příkazového řádku a tento příkaz přebírá všechny argumenty z druhé a ukládá je do proměnné , variable
.
Příklad
Zde je ukázkový skript.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Ukázkový běh:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Reference
Komentáře
- Všimněte si, že zobrazená technika shrnuje dané argumenty do jednoho tětiva. Pokud je potřebujete uchovat jako samostatné argumenty, použijte pole:
vars=( "${@:2}" )
- @glennjackman – děkujeme, že jste na to upozornili.
- Také všimněte si použití složených závorek. Měli byste vždy používat složené závorky, ale Bash vám umožňuje je vynechat, když je kontext jednoznačný.
$@
a${@}
jsou tedy totožné, i když ten druhý je " správnější " syntaxe. Závorky musíte použít s${@:2}
, protože$@:2
je nejednoznačný, a proto by měl být interpretován jako${@}:2
, což není totéž.
Odpověď
To „sa se nachází také v bash
a posledních verzích zsh
.
V ksh
a bash
máte přístup k několika prvkům pole pomocí syntaxe ${array[@]:first:length}
, která rozšiřuje až na length
(nebo všechny, pokud je length
vynechán) prvků array
pole (v seznamu prvků pole číselně seřazených podle indexů), počínaje prvním s indexem větším nebo rovným first
. Když ve skalárním kontextu (jako zde v an přiřazení ke skalární proměnné) je seznam prvků spojen s mezerou ch návštěvníci s bash
a ksh93
a s prvním znakem $IFS
(nebo nic, pokud $IFS
je prázdné nebo prázdné, pokud není nastaveno) s zsh
.
Například:
$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d>
$@
je zvláštní případ. $@
je pole pozičních parametrů ($1
, $2
…). Při použití s :
je však zahrnut také $0
. ${@:1}
je tedy stejný jako $@
, ne ${@:0}
jako u jiných polí.
V zsh
je to trochu jiné. zsh
přidal ksh
syntaxe pro kompatibilitu teprve nedávno, ale má vlastní syntaxi pro výběr rozsahů prvků.
Na rozdíl od ksh
a bash
, zsh
pole jsou odlišný typ proměnné než skalární proměnné, nejsou řídká (zsh
má asociativní pole jako jiný typ proměnné) a start v indexu 1 místo 0.
U zsh
přistupujete k rozsahům prvků pole s $a[first,last]
(kde last
může být také záporné, aby se počítalo zpět od konce).
V zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
vytvoří pole s 235 prvky, většinou prázdnými. $a[12,50]
by se rozšířil na prvky 12 až 50 a ${a[@]:12:2}
by se rozšířil pouze na (prázdné) $a[12]
a $a[13]
prvky. Jako zvláštní případ a opět pro přenositelnost ksh93
a bash
přijímá zsh
také 0
první prvek pro $@
a považuje to za $0
.
Takže můžete ${a[@]:x:n}
a ${@:x:n}
používat přenositelně ve všech 3 skořápkách, ale pouze pro nezřídka uspořádaná pole, a věnujte pozornost hodnota IFS.
Komentáře
- Děkujeme za vysvětlení syntaxe indexování pole
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Vidíte rozdíl?