Kuinka saan osion $@
Bashista tarvitsematta kopioida kaikki sijaintiparametrit toiselle tällaiselle taulukolle?
argv=( "$@" ) echo "${argv[@]:2}";
Kommentit
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
"$@"
.argv
-määritys rikkoutuisi, jos jokin argumentti sisältäisi välilyöntejä.