Hvordan kan jeg få et udsnit af $@
i Bash uden først at skulle kopiere alle positionsparametre til et andet array som dette?
argv=( "$@" ) echo "${argv[@]:2}";
Kommentarer
Svar
Du kan bruge det samme format som for ethvert andet array. For at udtrække det 2. og 3. element fra $@
skal du gøre:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Kommentarer
- Men dette ser ud til at fungere på en char for char basis i v4.1.2, er der en måde at gøre det på ord for ord basis?
- @AlexejMagura I forstår ikke ' hvad du mener. Det virker på elementerne i arrayet. Hvis du har elementer med et tegn, fungerer det " på tegn ". Hvis hvert element er et ord, fungerer det på ord. Prøver du måske dette på en streng og ikke en matrix?
- Jeg ' m prøver det på en kopi af " $ @ ", som jeg antager måske bliver en streng på det tidspunkt, jeg ' er ikke sikker.
- På bash 4.2.46 giver
"${@:1:2}"
mig faktisk 1. og 2. kommandolinjeargumenter . I mellemtiden giver"${@:1}"
mig de fulde kommandolinjeargumenter , og"${@:0}"
giver mig scriptnavnet efterfulgt af fulde kommandolinjeargumenter . - @Rockallite godt, ja. Det 2. og 3. element i
$@
-arrayet er det 1. og 2. argument."${@:1}"
vil udskrive hele arrayet startende med det 2. element (det første argument) og${@:0}
hele arrayet startende fra det første element, som er navnet på scriptet. Hvad forventede du?
Svar
For funktionsparametre er svaret med echo "${@:1:2}"
fungerede overhovedet ikke for mig. Jeg ville også have udskæring af det første element, da det var en anden parameter. Hvad fungerede 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[@]}" }
Måske skriver jeg for at teste for at se, hvordan dette fungerer med positionelle argumenter for på script-niveau, men ikke tid lige nu.
Svar
Jeg gør normalt dette:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
som udskrives:
message = first other = second third goforth
Du kan udvide konceptet ved at shift
ing efter argumentet andet, tredje osv.
"$@"
. Dinargv
-opgave ville brydes, hvis argumenter indeholdt mellemrum.