Bash: siivu sijaintiparametreja

Kuinka saan osion $@ Bashista tarvitsematta kopioida kaikki sijaintiparametrit toiselle tällaiselle taulukolle?

argv=( "$@" ) echo "${argv[@]:2}"; 

Kommentit

  • Lainaa aina "$@". argv -määritys rikkoutuisi, jos jokin argumentti sisältäisi välilyöntejä.

Vastaa

Voit käyttää samaa muotoa kuin mitä tahansa muuta taulukkoa. Voit purkaa toisen ja kolmannen elementin ryhmästä $@ seuraavasti:

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

Kommentit

  • Mutta tämä näyttää toimivan char by char -perusteisesti v4.1.2: ssä, onko olemassa tapa tehdä se sana sanalta?
  • @AlexejMagura I älä ' ymmärrä mitä tarkoitat. Se vaikuttaa matriisin elementteihin. Jos sinulla on yhden merkin elementtejä, se toimii " merkkeissä ". Jos jokainen elementti on sana, se toimii sanoilla. Yritätkö kenties tätä merkkijonolla eikä matriisilla?
  • I ' m kokeilen sitä " $ @ ", josta luultavasti voi tulla merkkijono tuossa vaiheessa, en ' ole varma.
  • Bash 4.2.46: ssa "${@:1:2}" antaa minulle todella komentorivin 1. ja 2. argumentit . Sillä välin "${@:1}" antaa minulle täydelliset komentoriviargumentit ja "${@:0}" antaa minulle komentosarjan nimen seuraa täydelliset komentoriviargumentit .
  • @Rockallite hyvin, kyllä. $@ -ryhmän 2. ja 3. elementti ovat 1. ja 2. argumentti. "${@:1}" tulostaa koko matriisin alkaen 2. elementistä (1. argumentti) ja ${@:0} koko taulukon alkaen ensimmäisestä elementistä, joka on komentosarjan nimi. Mitä odotit?

Vastaa

Funktioparametreille vastaus echo "${@:1:2}" ei toiminut minulle lainkaan. Halusin myös ensimmäisen osan leikkaamisen, koska se oli erilainen parametri. Mikä toimi:

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

Ehkä kirjoitan testataakseni, miten tämä toimii komentosarjan sijaintiarvojen kanssa, mutta ei aikaa tällä hetkellä.

Vastaa

Teen yleensä tämän:

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

joka tulostaa:

message = first other = second third goforth 

Voit laajentaa käsitettä shift lisäämällä toisen, kolmannen jne. argumentin jälkeen

Vastaa

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