Văd asta într-un script shell.
variable=${@:2}
Ce face?
Comentarii
Răspuns
Este „s afișarea conținutului variabilei speciale $@
, în Bash. Conține toate argumentele liniei de comandă, iar această comandă preia toate argumentele din a doua și le stochează într-o variabilă , variable
.
Exemplu
Iată un script examp.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Exemplu de rulare:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Referințe
Comentarii
- Rețineți că tehnica afișată combină argumentele date într-un singur şir. Dacă trebuie să le păstrați ca argumente separate, utilizați o matrice:
vars=( "${@:2}" )
- @glennjackman – vă mulțumim că ați arătat acest lucru.
- De asemenea, rețineți utilizarea parantezelor cretate. Ar trebui să folosiți întotdeauna paranteze cretate, dar Bash vă permite să le omiteți atunci când contextul este lipsit de ambiguitate. Prin urmare,
$@
și${@}
sunt identice, deși acesta din urmă este " mai corect " sintaxă. Trebuie să utilizați parantezele cu${@:2}
, deoarece$@:2
este ambiguu și, prin urmare, ar fi interpretat ca${@}:2
, care nu este același lucru.
Răspuns
Că „sa ksh
caracteristică găsită și în bash
și versiunile recente ale zsh
.
În ksh
și bash
, puteți accesa mai multe elemente ale unui tablou utilizând sintaxa ${array[@]:first:length}
, care se extinde până la length
(sau toate dacă length
este omis) elemente din array
array (în lista elementelor matricei sortate numeric pe indexuri), începând cu primul cu index mai mare sau egal cu first
. Când se află în context scalar (ca aici într-un atribuirea unei variabile scalare) lista elementelor este unită cu spațiul ch caractere cu bash
și ksh93
și cu primul caracter al $IFS
(sau nimic dacă $IFS
este gol sau spațiu dacă nu este setat) cu zsh
.
De exemplu:
$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d>
$@
este un caz special. $@
este matricea de parametri poziționali ($1
, $2
…). Dar când este utilizat cu :
, este inclus și $0
. Deci, ${@:1}
este același lucru cu $@
, nu ${@:0}
ca pentru alte tablouri.
În zsh
, este ușor diferit. zsh
a adăugat ksh
sintaxă doar recent pentru compatibilitate, dar are propria sa sintaxă pentru selectarea intervalelor de elemente.
Contrar ksh
și bash
, zsh
matricele sunt un tip de variabilă diferit de variabilele scalare, nu sunt rare (zsh
are tablouri asociative ca alt tip de variabilă) și începe la indexul 1 în loc de 0.
Pentru zsh
, accesați intervalele elementelor matricei cu $a[first,last]
(unde last
poate fi, de asemenea, negativ pentru a număra înapoi de la sfârșit).
În zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
creează o matrice cu 235 de elemente, majoritatea goale. $a[12,50]
s-ar extinde la elementele 12 – 50 și ${a[@]:12:2}
s-ar extinde doar la (gol) $a[12]
și $a[13]
elemente. Ca un caz special și din nou pentru portabilitate cu ksh93
și bash
, zsh
acceptă, de asemenea, un 0
primul element pentru $@
și tratează acest lucru ca $0
.
Deci, puteți utiliza ${a[@]:x:n}
și ${@:x:n}
portabil pe toate cele 3 cochilii, dar numai pentru matricele care nu sunt rare și să acordați atenție valoarea IFS.
Comentarii
- Vă mulțumim că ați explicat sintaxa indexării matricei
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Vedeți diferența?