Bash: helyzeti paraméterek szelete

Hogyan kaphatok egy $@ szeletet a Bash-ban anélkül, hogy először másolnunk kellene az összes pozícióparaméter egy másik ilyen tömbhöz?

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

Megjegyzések

  • Mindig idézz "$@". A argv hozzárendelés megszakad, ha bármelyik argum szóközt tartalmaz.

Válasz

Ugyanazt a formátumot használhatja, mint bármely más tömböt. A 2. és 3. elem kibontásához a $@ fájlból a következőket tenné:

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

Megjegyzések

  • De úgy tűnik, hogy ez char-by-char alapján működik a v4.1.2-ben, van-e mód arra, hogy ezt szóról szóra megtehessem?
  • @AlexejMagura I ne ' ne értsd, mire gondolsz. Ez a tömb elemeire hat. Ha van egy karakterből álló eleme, akkor " működik a " karaktereken. Ha minden elem szó, akkor szavakon működik. Talán ezt egy karakterláncon próbálja meg, és nem egy tömböt?
  • I ' m a " $ @ ", amelyről azt gondolom, hogy ezen a ponton karakterlánccá válhat, én ' nem vagyok biztos benne.
  • A 4.2.46-os verzión a "${@:1:2}" valójában megadja nekem az 1. és a 2. parancssori argumentumokat . Eközben a "${@:1}" megadja a teljes parancssori argumentumokat , a "${@:0}" pedig a szkript nevét. amelyet teljes parancssori argumentumok követnek .
  • @Rockallite is, igen. A $@ tömb 2. és 3. eleme az 1. és 2. argumentum. "${@:1}" kinyomtatja a teljes tömböt a 2. elemmel (az 1. argumentum) kezdve, a ${@:0} a teljes tömböt az 1. elemtől kezdve, amely a szkript neve. Mire számított?

Válasz

A függvényparamétereknél a egyáltalán nem működött nálam. Azt is szerettem volna az első elem szétválasztására, mivel ez egy másik paraméter volt. Mi működött:

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

Talán azért írok, hogy teszteljem, hogyan működik ez a helyzeti argumentumokkal a szkript szintjén, de jelenleg nincs idő.

Válasz

Általában ezt csinálom:

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

amely kinyomtatja:

message = first other = second third goforth 

A fogalmat kibővítheti úgy, hogy shift beírja a második, harmadik stb. argumentumot

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük