Come posso ottenere una porzione di $@
in Bash senza dover prima copiare tutti i parametri posizionali in un altro array come questo?
argv=( "$@" ) echo "${argv[@]:2}";
Commenti
Risposta
Puoi utilizzare lo stesso formato di qualsiasi altro array. Per estrarre il secondo e il terzo elemento da $@
, procedi nel seguente modo:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Commenti
- Ma questo sembra funzionare carattere per carattere nella v4.1.2, cè un modo per farlo parola per parola?
- @AlexejMagura I non ' per capire cosa intendi. Questo agisce sugli elementi dellarray. Se hai elementi di un carattere, funzionerà " sui caratteri ". Se ogni elemento è una parola, funziona sulle parole. Lo stai provando su una stringa e non su un array?
- ' lo sto provando su una copia di " $ @ ", che immagino potrebbe diventare una stringa a quel punto, ' non ne sono sicuro.
- Su bash 4.2.46,
"${@:1:2}"
in realtà mi fornisce il primo e il secondo argomento della riga di comando . Nel frattempo,"${@:1}"
mi fornisce gli argomenti completi della riga di comando e"${@:0}"
mi fornisce il nome dello script seguito da argomenti completi della riga di comando . - @Rockallite beh, sì. Il secondo e il terzo elemento dellarray
$@
sono il primo e il secondo argomento."${@:1}"
stamperà lintero array a partire dal secondo elemento (il primo argomento) e${@:0}
lintero array a partire dal primo elemento che è il nome dello script. Cosa ti aspettavi?
Risposta
Per i parametri di funzione, la risposta con echo "${@:1:2}"
non ha funzionato affatto per me. Inoltre, volevo che lo slice-off fosse il primo elemento, poiché era un parametro diverso. Quello che ha funzionato è stato:
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[@]}" }
Forse scriverò per testare per vedere come funziona con argomenti posizionali a livello di script, ma non cè tempo adesso.
Risposta
Di solito faccio questo:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
che stamperà:
message = first other = second third goforth
Puoi espandere il concetto shift
dopo il secondo, terzo, ecc. argomento
"$@"
.argv
lassegnazione si interrompeva se qualche argomento conteneva spazi.