nutools/lib/nulib/bash/base.arr.sh

362 lines
11 KiB
Bash

# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: base.arr base_ "Fonctions de base: gestion des variables tableaux"
require: base.core base.str
function: base_array_count "retourner le nombre d'éléments du tableau \$1"
function base_array_count() {
eval "echo \${#$1[*]}"
}
function: base_array_isempty "tester si le tableau \$1 est vide"
function base_array_isempty() {
eval "[ \${#$1[*]} -eq 0 ]"
}
function: base_array_new "créer un tableau vide dans la variable \$1"
function base_array_new() {
eval "$1=()"
}
function: base_array_copy "copier le contenu du tableau \$2 dans le tableau \$1"
function base_array_copy() {
eval "$1=(\"\${$2[@]}\")"
}
function: base_array_add "ajouter les valeurs \$2..@ à la fin du tableau \$1"
function base_array_add() {
local __aa_a="$1"; shift
eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")"
}
function: base_array_ins "insérer les valeurs \$2..@ au début du tableau \$1"
function base_array_ins() {
local __aa_a="$1"; shift
eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")"
}
function: base_array_del "supprimer *les* valeurs \$2 du tableau \$1"
function base_array_del() {
local __ad_v
local -a __ad_vs
eval '
for __ad_v in "${'"$1"'[@]}"; do
if [ "$__ad_v" != "$2" ]; then
__ad_vs=("${__ad_vs[@]}" "$__ad_v")
fi
done'
base_array_copy "$1" __ad_vs
}
function: base_array_addu "ajouter la valeur \$2 au tableau \$1, si la valeur n'y est pas déjà
Retourner vrai si la valeur a été ajoutée"
function base_array_addu() {
local __as_v
eval '
for __as_v in "${'"$1"'[@]}"; do
[ "$__as_v" == "$2" ] && return 1
done'
base_array_add "$1" "$2"
return 0
}
function: base_array_insu "insérer la valeur \$2 au début du tableau tableau \$1, si la valeur n'y est pas déjà
Retourner vrai si la valeur a été ajoutée."
function base_array_insu() {
local __as_v
eval '
for __as_v in "${'"$1"'[@]}"; do
[ "$__as_v" == "$2" ] && return 1
done'
base_array_ins "$1" "$2"
return 0
}
function: base_array_fillrange "Initialiser le tableau \$1 avec les nombres de \$2(=1) à \$3(=10) avec un step de \$4(=1)"
function base_array_fillrange() {
local -a __af_vs
local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}"
while [ "$__af_i" -le "$__af_to" ]; do
__af_vs=("${__af_vs[@]}" "$__af_i")
__af_i=$(($__af_i + $__af_step))
done
base_array_copy "$1" __af_vs
}
function: base_array_eq "tester l'égalité des tableaux \$1 et \$2"
function base_array_eq() {
local -a __ae_a1 __ae_a2
base_array_copy __ae_a1 "$1"
base_array_copy __ae_a2 "$2"
[ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1
local __ae_v __ae_i=0
for __ae_v in "${__ae_a1[@]}"; do
[ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1
__ae_i=$(($__ae_i + 1))
done
return 0
}
function: base_array_contains "tester si le tableau \$1 contient la valeur \$2"
function base_array_contains() {
local __ac_v
eval '
for __ac_v in "${'"$1"'[@]}"; do
[ "$__ac_v" == "$2" ] && return 0
done'
return 1
}
function: base_array_icontains "tester si le tableau \$1 contient la valeur \$2, sans tenir compte de la casse"
function base_array_icontains() {
local __ac_v
eval '
for __ac_v in "${'"$1"'[@]}"; do
[ "${__ac_v,,} == "${2,,}" ] && return 0
done'
return 1
}
function: base_array_find "si le tableau \$1 contient la valeur \$2, afficher l'index de la valeur. Si le tableau \$3 est spécifié, afficher la valeur à l'index dans ce tableau"
function base_array_find() {
local __af_i __af_v
__af_i=0
eval '
for __af_v in "${'"$1"'[@]}"; do
if [ "$__af_v" == "$2" ]; then
if [ -n "$3" ]; then
recho "${'"$3"'[$__af_i]}"
else
echo "$__af_i"
fi
return 0
fi
__af_i=$(($__af_i + 1))
done'
return 1
}
function: base_array_reverse "Inverser l'ordre des élément du tableau \$1"
function base_array_reverse() {
local -a __ar_vs
local __ar_v
base_array_copy __ar_vs "$1"
base_array_new "$1"
for __ar_v in "${__ar_vs[@]}"; do
base_array_ins "$1" "$__ar_v"
done
}
function: base_array_replace "dans le tableau \$1, remplacer toutes les occurences de \$2 par \$3..*"
function base_array_replace() {
local __ar_sn="$1"; shift
local __ar_f="$1"; shift
local -a __ar_s __ar_d
local __ar_v
base_array_copy __ar_s "$__ar_sn"
for __ar_v in "${__ar_s[@]}"; do
if [ "$__ar_v" == "$__ar_f" ]; then
__ar_d=("${__ar_d[@]}" "$@")
else
__ar_d=("${__ar_d[@]}" "$__ar_v")
fi
done
base_array_copy "$__ar_sn" __ar_d
}
function: base_array_each "Pour chacune des valeurs ITEM du tableau \$1, appeler la fonction \$2 avec les arguments (\$3..@ ITEM)"
function base_array_each() {
local __ae_v
local -a __ae_a
base_array_copy __ae_a "$1"; shift
for __ae_v in "${__ae_a[@]}"; do
"$@" "$__ae_v"
done
}
function: base_array_map "Pour chacune des valeurs ITEM du tableau \$1, appeler la fonction \$2 avec les arguments (\$3..@ ITEM), et remplacer la valeur par le résultat de la fonction"
function base_array_map() {
local __am_v
local -a __am_a __am_vs
local __am_an="$1"; shift
local __am_f="$1"; shift
base_array_copy __am_a "$__am_an"
for __am_v in "${__am_a[@]}"; do
__am_vs=("${__am_vs[@]}" "$("$__am_f" "$@" "$__am_v")")
done
base_array_copy "$__am_an" __am_vs
}
function: base_array_first "afficher la première valeur du tableau \$1"
function base_array_first() {
eval "recho \"\${$1[@]:0:1}\""
}
function: base_array_last "afficher la dernière valeur du tableau \$1"
function base_array_last() {
eval "recho \"\${$1[@]: -1:1}\""
}
function: base_array_copy_firsts "copier toutes les valeurs du tableau \$2(=\$1) dans le tableau \$1, excepté la dernière"
function base_array_copy_firsts() {
eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")"
}
function: base_array_copy_lasts "copier toutes les valeurs du tableau \$2(=\$1) dans le tableau \$1, excepté la première"
function base_array_copy_lasts() {
eval "$1=(\"\${${2:-$1}[@]:1}\")"
}
function: base_array_extend "ajouter le contenu du tableau \$2 au tableau \$1"
function base_array_extend() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")"
}
function: base_array_extendu "ajouter chacune des valeurs du tableau \$2 au tableau \$1, si ces valeurs n'y sont pas déjà
Retourner vrai si au moins une valeur a été ajoutée"
function base_array_extendu() {
local __ae_v __ae_s=1
eval '
for __ae_v in "${'"$2"'[@]}"; do
base_array_addu "$1" "$__ae_v" && __ae_s=0
done'
return "$__ae_s"
}
function: base_array_extend_firsts "ajouter toutes les valeurs du tableau \$2 dans le tableau \$1, excepté la dernière"
function base_array_extend_firsts() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")"
}
function: base_array_extend_lasts "ajouter toutes les valeurs du tableau \$2 dans le tableau \$1, excepté la première"
function base_array_extend_lasts() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")"
}
function: base_array_xsplit "créer le tableau \$1 avec chaque élément de \$2 (un ensemble d'éléments séparés par \$3, qui vaut ':' par défaut)"
function base_array_xsplit() {
eval "$1=($(recho_ "$2" | lawk -v RS="${3:-:}" '
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_xsplitc "variante de base_array_xsplit() où le séparateur est ',' par défaut"
function base_array_xsplitc() {
base_array_xsplit "$1" "$2" "${3:-,}"
}
function: base_array_split "créer le tableau \$1 avec chaque élément de \$2 (un ensemble d'éléments séparés par \$3, qui vaut ':' par défaut)
Les éléments vides sont ignorés. par exemple \"a::b\" est équivalent à \"a:b\""
function base_array_split() {
eval "$1=($(recho_ "$2" | lawk -v RS="${3:-:}" '
/^$/ { next }
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_splitc "variante de base_array_split() où le séparateur est ',' par défaut"
function base_array_splitc() {
base_array_split "$1" "$2" "${3:-,}"
}
function: base_array_xsplitl "créer le tableau \$1 avec chaque ligne de \$2"
function base_array_xsplitl() {
eval "$1=($(recho_ "$2" | strnl2lf | lawk '
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_splitl "créer le tableau \$1 avec chaque ligne de \$2
Les lignes vides sont ignorés."
function base_array_splitl() {
eval "$1=($(recho_ "$2" | strnl2lf | lawk '
/^$/ { next }
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_join "afficher le contenu du tableau \$1 sous forme d'une liste de valeurs séparées par \$2 (qui vaut ':' par défaut)
* Si \$1==\"@\", alors les éléments du tableaux sont les arguments de la fonction à partir de \$3
* Si \$1!=\"@\" et que le tableau est vide, afficher \$3
* Si \$1!=\"@\", \$4 et \$5 sont des préfixes et suffixes à rajouter à chaque élément"
function base_array_join() {
local __aj_an __aj_l __aj_j __aj_s="${2:-:}" __aj_pf __aj_sf
if [ "$1" == "@" ]; then
__aj_an="\$@"
shift; shift
else
__aj_an="\${$1[@]}"
__aj_pf="$4"
__aj_sf="$5"
fi
eval '
for __aj_l in "'"$__aj_an"'"; do
__aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf"
done'
if [ -n "$__aj_j" ]; then
recho "$__aj_j"
elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then
recho "$3"
fi
}
function: base_array_joinc "afficher les éléments du tableau \$1 séparés par ','"
function base_array_joinc() {
base_array_join "$1" , "$2" "$3" "$4"
}
function: base_array_joinl "afficher les éléments du tableau \$1 à raison d'un élément par ligne"
function base_array_joinl() {
base_array_join "$1" "
" "$2" "$3" "$4"
}
function: base_array_mapjoin "map le tableau \$1 avec la fonction \$2, puis afficher le résultat en séparant chaque élément par \$3
Les arguments et la sémantique sont les mêmes que pour base_array_join() en
tenant compte de l'argument supplémentaire \$2 qui est la fonction pour
base_array_map() (les autres arguments sont décalés en conséquence)"
function base_array_mapjoin() {
local __amj_src="$1" __amj_func="$2" __amj_sep="$3"
shift; shift; shift
if [ "$__amj_src" == "@" ]; then
local -a __amj_tmpsrc
__amj_tmpsrc=("$@")
__amj_src=__amj_tmpsrc
set --
fi
local -a __amj_tmp
base_array_copy __amj_tmp "$__amj_src"
base_array_map __amj_tmp "$__amj_func"
base_array_join __amj_tmp "$__amj_sep" "$@"
}
function: base_array_fix_paths "Corriger les valeurs du tableau \$1. Les valeurs contenant le séparateur \$2(=':') sont séparées en plusieurs valeurs.
Par exemple avec le tableau input=(a b:c), le résultat est input=(a b c)"
function base_array_fix_paths() {
local __afp_an="$1" __afp_s="${2:-:}"
local -a __afp_vs
local __afp_v
base_array_copy __afp_vs "$__afp_an"
base_array_new "$__afp_an"
for __afp_v in "${__afp_vs[@]}"; do
base_array_split __afp_v "$__afp_v" "$__afp_s"
base_array_extend "$__afp_an" __afp_v
done
}