Jak uzyskać wycinek $@
w Bash bez konieczności uprzedniego kopiowania wszystkie parametry pozycyjne do innej tablicy, takiej jak ta?
argv=( "$@" ) echo "${argv[@]:2}";
Komentarze
Odpowiedź
Możesz użyć tego samego formatu, co w przypadku każdej innej tablicy. Aby wyodrębnić drugi i trzeci element z $@
, wykonaj:
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
Komentarze
- Ale to wydaje się działać na zasadzie char po znaku w wersji 4.1.2, czy istnieje sposób, aby to zrobić na podstawie słowa po słowie?
- @AlexejMagura I nie ' nie rozumiem, co masz na myśli. To działa na elementy tablicy. Jeśli masz elementy jednoznakowe, będzie działać " ze znakami ". Jeśli każdy element jest słowem, działa na słowach. Czy może próbujesz tego dokonać na łańcuchu, a nie na tablicy?
- Ja ' próbuję to na kopii " $ @ ", który, jak sądzę, może stać się w tym momencie ciągiem, ' nie jestem pewien.
- W bash 4.2.46
"${@:1:2}"
faktycznie podaje mi pierwszy i drugi argument wiersza poleceń . W międzyczasie"${@:1}"
podaje pełne argumenty wiersza poleceń , a"${@:0}"
podaje nazwę skryptu po którym następują pełne argumenty wiersza poleceń . - @Rockallite no cóż, tak. Drugi i trzeci element tablicy
$@
to pierwszy i drugi argument."${@:1}"
wydrukuje całą tablicę, zaczynając od drugiego elementu (pierwszego argumentu) i${@:0}
, zaczynając od pierwszego elementu, którym jest nazwa skryptu. Czego się spodziewałeś?
Odpowiedź
W przypadku parametrów funkcji odpowiedź z echo "${@:1:2}"
w ogóle nie działało. Poza tym chciałem odciąć pierwszy element, ponieważ był to inny parametr. Zadziałało:
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że napiszę, żeby sprawdzić, jak to działa z argumentami pozycyjnymi na poziomie skryptu, ale nie mam teraz czasu.
Odpowiedź
Zwykle robię to:
somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth
co spowoduje wydrukowanie:
message = first other = second third goforth
Możesz rozwinąć tę koncepcję, shift
po drugim, trzecim itd. argumencie
"$@"
. Przypisanieargv
zepsułoby się, gdyby któryś z argumentów zawierał spacje.