Bash: plátek pozičních parametrů

Jak mohu získat plátek $@ v Bashi, aniž bych musel nejprve kopírovat všechny poziční parametry do jiného takového pole?

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

Komentáře

  • Vždy citovat "$@". argv přiřazení by se přerušilo, pokud by nějaké pole obsahovalo mezery.

odpověď

Můžete použít stejný formát jako pro jakékoli jiné pole. Chcete-li extrahovat 2. a 3. prvek z $@, postupujte takto:

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

Komentáře

  • Zdá se však, že to v4.1.2 funguje na principu char by char, existuje způsob, jak to udělat po slovech?
  • @AlexejMagura I nerozumějte, co máte na mysli ' To působí na prvky pole. Pokud máte jednoznakové prvky, bude to fungovat " na znaky ". Pokud je každý prvek slovem, funguje to iu slov. Zkoušíte to možná na řetězci a ne na poli?
  • Zkouším to ' na kopii " $ @ ", který by se v tu chvíli mohl stát řetězcem, si ' nejsem jistý.
  • V bash 4.2.46 mi "${@:1:2}" ve skutečnosti dává 1. a 2. argumenty příkazového řádku . Mezitím mi "${@:1}" dává úplné argumenty příkazového řádku a "${@:0}" mi název skriptu následované úplnými argumenty příkazového řádku .
  • @Rockallite dobře, ano. 2. a 3. prvek pole $@ jsou první a druhý argument. "${@:1}" vytiskne celé pole počínaje 2. prvkem (1. argument) a ${@:0} celé pole počínaje 1. prvkem, který je název skriptu. Co jste čekali?

Odpověď

U parametrů funkce odpovídá odpověď echo "${@:1:2}" nepracoval pro mě vůbec. Také jsem chtěl slice-off první prvek, protože to byl jiný parametr. Co fungovalo bylo:

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

Možná napíšu, abych zjistil, jak to funguje s pozičními argumenty pro na úrovni skriptu, ale právě teď.

Odpovědět

Obvykle to dělám:

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

, které vytiskne:

message = first other = second third goforth 

Koncept můžete rozšířit shift po druhém, třetím atd. argumentu

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *