Comment découper un tableau dans Bash
À la recherche de la "Matrice" dans la section de bash(1) page de manuel, je n'ai pas trouver un moyen de découper un tableau.
Alors je suis venu avec ce trop compliqué fonction:
#!/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 )"
}
Utilisée comme ceci:
$ A=( foo bar "a b c" 42 )
$ slice B A 1 2
$ echo "${B[0]}" # bar
$ echo "${B[1]}" # a b c
Est-il une meilleure façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Voir le Paramètre D'Extension section dans le Bash
man
page.A[@]
retourne le contenu de la matrice,:1:2
prend une tranche de longueur 2, en commençant à l'indice 1.Noter que le fait que "a b c" est un élément de tableau (et qu'il contient un espace supplémentaire) est préservée.
${!A[@]}
?idx=(${!A[@]}); echo ${idx[@]:1}
.$@
?${@[@]:1:2}
donne l'erreurbad substitution
.${@:1:2}
$@
à un tableau avant de faire ceci ou arguments qui contenait des espaces obtenir split:ARGS=( "$@" ); ARGS_AFTER_FIRST=( "${ARGS[@]:1}" )
C=("{$A[@]:1}"); echo "${C[@]}" # bar a b c 42
C
variable, de la première tranche d'{
devrait l'être après$
. Je ne peut pas proposer une modification de 6 caractères doivent être modifiées au moins.${C[@]: -2:2}
, de résoudre les deux derniers éléments deC
. (Utile pour l'extraction, disent que le dernier élément d'un tableau)Il y a aussi un raccourci commode pour obtenir tous les éléments de la matrice de départ avec l'index spécifié. Par exemple "${A[@]:1}" serait la "queue" de la matrice, qui est la matrice sans son premier élément.
echo "${A[@]::1}" # 4
"${${@}[@]:1}"
.${@:2}
fonctionne très bien.Tableau de découpage comme en Python (à Partir de la rebash bibliothèque):
Permet de dire que je suis de la lecture d'un tableau à partir d'utilisateur, puis je veux voir à l'élément 3 à 7 inclusivement .