Przeglądając sekcję „Tablica” na stronie podręcznika bash (1), nie znalazłem sposobu na wycięcie tablicy.
Więc wymyśliłem tę zbyt skomplikowaną funkcję:
#!/bin/bash
# @brief: slice a bash array
# @arg1: output-name
# @arg2: input-name
# @args: seq args
# ----------------------------------------------
function slice() {
local output=$1
local input=$2
shift 2
local indexes=$(seq $*)
local -i i
local tmp=$(for i in $indexes
do echo "$(eval echo \"\${$input[$i]}\")"
done)
local IFS=$'\n'
eval $output="( \$tmp )"
}
Używany w ten sposób:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Czy jest na to lepszy sposób?
Odpowiedzi:
Zobacz sekcję Rozszerzanie parametrów na
man
stronie Bash .A[@]
zwraca zawartość tablicy,:1:2
pobiera plasterek o długości 2, zaczynając od indeksu 1.Zauważ, że fakt, że „ab c” jest jednym elementem tablicy (i zawiera dodatkową spację) zostaje zachowany.
źródło
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
na odpowiednią tablicę, zanim to zrobię, lub argumenty zawierające spacje zostaną podzielone:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
Istnieje również wygodny skrót, aby uzyskać wszystkie elementy tablicy, zaczynając od określonego indeksu. Na przykład „$ {A [@]: 1}” byłoby „ogonem” tablicy, czyli tablicą bez pierwszego elementu.
źródło
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
działa dobrze.Wycinanie tablic jak w Pythonie (z biblioteki rebash ):
źródło
Powiedzmy, że czytam tablicę od użytkownika, a następnie chcę zobaczyć elementy 3–7 łącznie.
źródło