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$@:2je 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?