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
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. 
"$@". Atribuirea dvs.argvs-ar întrerupe dacă orice argumente ar conține spații.