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
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
"$@"
.argv
přiřazení by se přerušilo, pokud by nějaké pole obsahovalo mezery.