Olhando a seção "Matriz" na página do manual bash (1), não encontrei uma maneira de dividir uma matriz.
Então, eu vim com essa função excessivamente complicada:
#!/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 )"
}
Usado assim:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Existe uma maneira melhor de fazer isso?
Respostas:
Consulte a seção Expansão de parâmetros na
man
página Bash .A[@]
retorna o conteúdo da matriz,:1:2
pega uma fatia do comprimento 2, iniciando no índice 1.Observe que o fato de "ab c" ser um elemento da matriz (e que contém um espaço extra) é preservado.
fonte
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
para uma matriz adequada antes de fazer isso ou argumentos que continha espaços iria ficar dividido:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
Também existe um atalho conveniente para obter todos os elementos da matriz começando com o índice especificado. Por exemplo "$ {A [@]: 1}" seria a "cauda" da matriz, ou seja, a matriz sem seu primeiro elemento.
fonte
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
funciona bem.Matriz cortando como em Python (da biblioteca de atualização ):
fonte
Digamos que estou lendo uma matriz do usuário, e quero ver os elementos 3 a 7, inclusive.
fonte