Mirando la sección "Array" en la página de manual bash (1), no encontré una manera de cortar una matriz.
Entonces se me ocurrió esta función demasiado 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 así:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
¿Hay una mejor manera de hacer esto?
Respuestas:
Consulte la sección Expansión de parámetros en la
man
página Bash .A[@]
devuelve el contenido de la matriz,:1:2
toma una porción de longitud 2, comenzando en el índice 1.Tenga en cuenta que se conserva el hecho de que "ab c" es un elemento de matriz (y que contiene un espacio adicional).
fuente
idx=(${!A[@]}); echo ${idx[@]:1}
.${@:1:2}
$@
a una matriz adecuada antes de hacer esto o los argumentos que contenían espacios se dividirían:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
También hay un atajo conveniente para obtener todos los elementos de la matriz comenzando con el índice especificado. Por ejemplo, "$ {A [@]: 1}" sería la "cola" de la matriz, es decir, la matriz sin su primer elemento.
fuente
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
funciona bien.Corte de matriz como en Python (de la biblioteca rebash ):
fuente
Digamos que estoy leyendo una matriz del usuario, luego quiero ver los elementos 3 a 7 ambos inclusive.
fuente