Hur kan jag få en del av $@
i Bash utan att först behöva kopiera alla positionsparametrar till en annan matris som denna?
argv=( "$@" ) echo "${argv[@]:2}";
Kommentarer
Svar
Du kan använda samma format som för alla andra matriser. För att extrahera det andra och tredje elementet från $@
skulle du göra:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Kommentarer
- Men detta verkar fungera på char-char-basis i v4.1.2, finns det ett sätt att göra det ord för ord?
- @AlexejMagura I förstår inte ' vad du menar. Det verkar på elementen i matrisen. Om du har ett teckenelement fungerar det " på tecken ". Om varje element är ett ord fungerar det på ord. Försöker du kanske detta på en sträng och inte en matris?
- Jag ' jag försöker på en kopia av " $ @ ", vilket jag antar kan bli en sträng vid den tiden, jag ' är inte säker.
- På bash 4.2.46,
"${@:1:2}"
ger mig faktiskt kommandoradsargumenten första och andra >. Under tiden ger"${@:1}"
mig fullständiga kommandoradsargument och"${@:0}"
ger mig skriptnamnet följt av fullständiga kommandoradsargument . - @Rockallite bra, ja. Det andra och tredje elementet i
$@
matrisen är det första och andra argumentet."${@:1}"
kommer att skriva ut hela arrayen med början med det andra elementet (det första argumentet) och${@:0}
hela arrayen med början från det första elementet som är namnet på manuset. Vad förväntade du dig?
Svar
För funktionsparametrar, svaret med echo "${@:1:2}"
fungerade inte alls för mig. Jag ville också att avskärningen skulle vara det första elementet, eftersom det var en annan parameter. Vad som fungerade var:
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[@]}" }
Kanske skriver jag för att testa för att se hur detta fungerar med positionella argument för på skriptnivå, men ingen tid just nu.
Svar
Jag brukar göra det här:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
som kommer att skrivas ut:
message = first other = second third goforth
Du kan utöka konceptet genom att shift
ing efter argumentet andra, tredje osv.
"$@"
. Dinargv
-uppgift skulle brytas om några args innehöll mellanslag.