Hoe kan ik een deel $@
in Bash krijgen zonder eerst te hoeven kopiëren alle positionele parameters naar een andere array zoals deze?
argv=( "$@" ) echo "${argv[@]:2}";
Reacties
Antwoord
U kunt hetzelfde formaat gebruiken als voor elke andere array. Om het 2e en 3e element uit $@
te halen, doet u het volgende:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Reacties
- Maar dit lijkt te werken op char by char basis in v4.1.2, is er een manier om dit woord voor woord te doen?
- @AlexejMagura I niet ' begrijpen wat je bedoelt. Dat werkt op de elementen van de array. Als u elementen van één teken heeft, werkt het " op tekens ". Als elk element een woord is, werkt het op woorden. Probeer je dit misschien op een string en niet op een array?
- Ik ' m probeer het op een kopie van " $ @ ", waarvan ik vermoed dat het op dat moment een string kan worden, ik ' ben niet zeker.
- Op bash 4.2.46,
"${@:1:2}"
geeft me eigenlijk de eerste en 2e opdrachtregelargumenten . Ondertussen geeft"${@:1}"
me de volledige opdrachtregelargumenten , en"${@:0}"
geeft me de scriptnaam gevolgd door volledige opdrachtregelargumenten . - @Rockallite nou ja. Het 2e en 3e element van de
$@
-array zijn de 1e en 2e argumenten."${@:1}"
drukt de hele array af, beginnend met het 2e element (het 1e argument) en${@:0}
de hele array, beginnend bij het 1e element dat is de naam van het script. Wat had je verwacht?
Antwoord
Voor functieparameters, het antwoord met echo "${@:1:2}"
werkte helemaal niet voor mij. Ik wilde ook het eerste element afsnijden, omdat het een andere parameter was. Wat wel werkte, was:
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[@]}" }
Misschien zal ik schrijven om te testen hoe dit werkt met positionele argumenten voor op scriptniveau, maar nu heb ik geen tijd.
Antwoord
Meestal doe ik dit:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
wat zal afdrukken:
message = first other = second third goforth
Je kunt het concept uitbreiden door shift
ing na het tweede, derde, etc. argument
"$@"
. Jeargv
toewijzing zou breken als args spaties bevatten.