Näen tämän shell-komentosarjassa.
variable=${@:2}
Mitä se tekee?
Kommentit
Vastaa
Se ”s näyttää erityisen muuttujan $@
sisällön Bashissa. Se sisältää kaikki komentoriviargumentit, ja tämä komento vie kaikki toisen argumentit päälle ja tallentaa ne muuttujaan , variable
.
Esimerkki
Tässä on exampe-komentosarja.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Esimerkkiajo:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
viitteet
Kommentit
- Huomaa, että esitetty tekniikka sekoittaa annetut argumentit yhdeksi merkkijono. Jos haluat pitää ne erillisinä argumentteina, käytä taulukkoa:
vars=( "${@:2}" )
- @glennjackman – kiitos, että osoitit sen.
- myös huomaa kiharoiden sulkujen käyttö. Sinun on tarkoitus käyttää aina kiharaisia sulkeita, mutta Bash antaa sinun jättää ne pois, kun asiayhteys on yksiselitteinen. Siksi
$@
ja${@}
ovat identtisiä, vaikka jälkimmäinen onkin " oikeampi " syntakse. Sinun on käytettävä hakasulkeita${@:2}
-merkillä, koska$@:2
on epäselvä ja siksi se tulkitaan nimellä${@}:2
, mikä ei ole sama asia.
Vastaa
Että ”sa ksh
-ominaisuus löytyy myös kohdasta bash
ja uusimmista versioista zsh
.
Kohdassa ksh
ja bash
, voit käyttää useita matriisin elementtejä ${array[@]:first:length}
-syntaksilla, joka laajenee enintään length
(tai kaikki, jos length
jätetään pois) array
-elementteihin taulukko (luettelon elementtiluettelossa, joka on lajiteltu numeerisesti hakemistoihin) alkaen ensimmäisestä, jonka indeksi on suurempi tai yhtä suuri kuin first
. Kun se on skalaarikontekstissa (kuten täällä osoitus skalaarimuuttujaan) elementtiluettelo liitetään välilyöntiin ch merkit, joissa on bash
ja ksh93
ja $IFS
-merkki (tai ei mitään, jos $IFS
on tyhjä tai välilyönti, jos sitä ei ole asetettu) merkinnällä zsh
.
Esimerkiksi:
$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d>
$@
on erityistapaus. $@
on sijaintiparametrien joukko ($1
, $2
…). Mutta kun sitä käytetään :
: n kanssa, myös $0
sisältyy. Joten ${@:1}
on sama kuin $@
, ei ${@:0}
kuten muilla matriiseilla.
Kohdassa zsh
se on hieman erilainen. zsh
lisäsi ksh
syntaksi vasta äskettäin yhteensopivuuden takaamiseksi, mutta sillä on oma syntaksinsa elementtialueiden valitsemiseen.
Päinvastoin kuin ksh
ja bash
, zsh
matriisit ovat erilainen muuttujatyyppi kuin skalaarimuuttujat, eivät ole harvinaisia (zsh
on assosiatiiviset taulukot toisena muuttujatyyppinä) ja aloita hakemistossa 1 sijasta 0.
zsh
-sovelluksessa voit käyttää taulukkoelementtialueita $a[first,last]
(missä last
voi olla myös negatiivinen laskettaessa taaksepäin lopusta).
Kohdassa zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
luo taulukon, jossa on 235 elementtiä, joista suurin osa on tyhjiä. $a[12,50]
laajenisi elementteihin 12-50 ja ${a[@]:12:2}
laajenisi vain (tyhjiin) $a[12]
ja $a[13]
-elementit. Erikoistapauksena ja uudelleen siirrettävyyden kannalta ksh93
ja bash
, hyväksyy myös zsh
0
ensimmäinen elementti ryhmälle $@
ja käsittelee sitä nimellä $0
.
Joten voit käyttää ${a[@]:x:n}
ja ${@:x:n}
kannettavasti kaikissa kolmessa kuoressa, mutta vain ei-harvoissa taulukoissa, ja kiinnittää huomiota IFS: n arvo.
kommentit
- kiitos taulukon indeksointisyntaksin selittämisestä
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Näetkö eron?