Просматривая раздел «Массив» на справочной странице bash (1), я не нашел способа нарезать массив.
Итак, я придумал эту чрезмерно сложную функцию:
#!/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 )"
}
Используется так:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Есть лучший способ сделать это?
Ответы:
См. Раздел « Расширение параметров » на
man
странице Bash .A[@]
возвращает содержимое массива,:1:2
принимает фрагмент длиной 2, начиная с индекса 1.Обратите внимание, что факт, что «ab c» является одним элементом массива (и что он содержит дополнительный пробел), сохраняется.
источник
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
в правильный массив, прежде чем делать это, иначе аргументы, содержащие пробелы, будут разделены:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
Существует также удобный ярлык для получения всех элементов массива, начиная с указанного индекса. Например, «$ {A [@]: 1}» будет «хвостом» массива, то есть массивом без его первого элемента.
источник
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
работает отлично.Нарезка массива как в Python (из библиотеки rebash ):
источник
Допустим, я читаю массив от пользователя, затем я хочу видеть элементы с 3 по 7 включительно.
источник