Bash: wycinek parametrów pozycyjnych

Jak uzyskać wycinek $@ w Bash bez konieczności uprzedniego kopiowania wszystkie parametry pozycyjne do innej tablicy, takiej jak ta?

argv=( "$@" ) echo "${argv[@]:2}"; 

Komentarze

  • Zawsze cytuj "$@". Przypisanie argv zepsułoby się, gdyby któryś z argumentów zawierał spacje.

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *