Bash: felie de parametri poziționali

Cum pot obține o porțiune de $@ în Bash fără a mai fi nevoie să copiez toți parametrii de poziție la o altă matrice ca aceasta?

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

Comentarii

  • Citați întotdeauna "$@". Atribuirea dvs. argv s-ar întrerupe dacă orice argumente ar conține spații.

Răspuns

Puteți utiliza același format ca pentru orice altă matrice. Pentru a extrage elementele 2 și 3 din $@, veți face:

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

Comentarii

  • Dar acest lucru pare să funcționeze pe baza caracterului char în v4.1.2, există o modalitate de a face acest lucru pe bază de cuvânt?
  • @AlexejMagura I nu ' nu înțelegeți la ce vă referiți. Aceasta acționează asupra elementelor matricei. Dacă aveți elemente cu un singur caracter, acesta va funcționa " pe caractere ". Dacă fiecare element este un cuvânt, acesta funcționează pe cuvinte. Încercați probabil acest lucru pe un șir și nu pe un tablou?
  • Îl ' îl încerc pe o copie a " $ @ ", care cred că ar putea deveni un șir în acel moment, nu ' nu sunt sigur.
  • Pe baza 4.2.46, "${@:1:2}" îmi oferă de fapt 1st și 2nd argumente din linia de comandă . Între timp, "${@:1}" îmi oferă argumentele complete ale liniei de comandă și "${@:0}" îmi dă numele scriptului urmat de argumente complete pentru linia de comandă .
  • @Rockallite bine, da. Al doilea și al treilea element al matricei $@ sunt primul și al doilea argument. "${@:1}" va imprima întregul tablou începând cu al doilea element (primul argument) și ${@:0} întregul tablou începând cu primul element care este numele scriptului. La ce vă așteptați?

Răspuns

Pentru parametrii funcției, răspunsul cu echo "${@:1:2}" nu a funcționat deloc pentru mine. De asemenea, am dorit ca primul element să fie redus, deoarece era un parametru diferit. Ceea ce a funcționat a fost:

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[@]}" } 

Poate că voi scrie la test pentru a vedea cum funcționează acest lucru cu argumente poziționale pentru la nivel de script, dar nu este moment acum.

Răspuns

De obicei, fac asta:

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

care se va imprima:

message = first other = second third goforth 

Puteți extinde conceptul shift după un al doilea, al treilea argument etc.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *