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.argv
s-ar întrerupe dacă orice argumente ar conține spații.