Bash: porzione di parametri posizionali

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

  • Cita sempre "$@". argv lassegnazione si interrompeva se qualche argomento conteneva spazi.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *