Mitä tämä $ {@: 2} tarkoittaa shell-komentosarjoissa

Näen tämän shell-komentosarjassa.

variable=${@:2} 

Mitä se tekee?

Kommentit

  • Oliko se juuri niin komentosarjassa? Syntaksi näyttää matriisilta, mutta siitä puuttuu joitain kappaleita. Voitteko lähettää pari riviä tämän rivin ympärille käsikirjoituksesta?
  • Se on muuttuja, joka alkaa toisesta kirjaimesta. var="my_value"; echo var="${var[@]:2}"; echo "$var" Näetkö eron?

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ä

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *