190 lines
6.4 KiB
Bash
190 lines
6.4 KiB
Bash
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||
|
##@cooked nocomments
|
||
|
module: base.split "Fonctions de base: analyse et découpage de valeurs"
|
||
|
require: base.arr
|
||
|
|
||
|
function: splitfsep "\
|
||
|
Découper \$1 de la forme first[SEPsecond] entre first, qui est placé dans la
|
||
|
variable \$3(=first) et second, qui est placée dans la variable \$4(=second). \$2
|
||
|
est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP."
|
||
|
function splitfsep() {
|
||
|
if [[ "$1" == *"$2"* ]]; then
|
||
|
setv "${3:-first}" "${1%%$2*}"
|
||
|
setv "${4:-second}" "${1#*$2}"
|
||
|
else
|
||
|
setv "${3:-first}" "$1"
|
||
|
setv "${4:-second}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function: splitfsep2 "\
|
||
|
Découper \$1 de la forme [firstSEP]second entre first, qui est placé dans la
|
||
|
variable \$3(=first) et second, qui est placée dans la variable \$4(=second). \$2
|
||
|
est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP."
|
||
|
function splitfsep2() {
|
||
|
if [[ "$1" == *"$2"* ]]; then
|
||
|
setv "${3:-first}" "${1%%$2*}"
|
||
|
setv "${4:-second}" "${1#*$2}"
|
||
|
else
|
||
|
setv "${3:-first}"
|
||
|
setv "${4:-second}" "$1"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function: splitlsep "\
|
||
|
Découper \$1 de la forme first[SEPsecond] entre first, qui est placé dans la
|
||
|
variable \$3(=first) et second, qui est placée dans la variable \$4(=second). \$2
|
||
|
est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP."
|
||
|
function splitlsep() {
|
||
|
if [[ "$1" == *"$2"* ]]; then
|
||
|
setv "${3:-first}" "${1%$2*}"
|
||
|
setv "${4:-second}" "${1##*$2}"
|
||
|
else
|
||
|
setv "${3:-first}" "$1"
|
||
|
setv "${4:-second}"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function: splitlsep2 "\
|
||
|
Découper \$1 de la forme [firstSEP]second entre first, qui est placé dans la
|
||
|
variable \$3(=first) et second, qui est placée dans la variable \$4(=second). \$2
|
||
|
est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP."
|
||
|
function splitlsep2() {
|
||
|
if [[ "$1" == *"$2"* ]]; then
|
||
|
setv "${3:-first}" "${1%$2*}"
|
||
|
setv "${4:-second}" "${1##*$2}"
|
||
|
else
|
||
|
setv "${3:-first}"
|
||
|
setv "${4:-second}" "$1"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function: splitvar "\
|
||
|
Découper \$1 de la forme name[=value] entre le nom, qui est placé dans la
|
||
|
variable \$2(=name) et la valeur, qui est placée dans la variable \$3(=value)"
|
||
|
function splitvar() {
|
||
|
splitfsep "$1" = "${2:-name}" "${3:-value}"
|
||
|
}
|
||
|
|
||
|
function: splitpath "\
|
||
|
Découper \$1 de la forme [dir/]name entre le répertoire, qui est placé dans la
|
||
|
variable \$2(=dir), et le nom du fichier, qui est placé dans la variable
|
||
|
\$3(=name)"
|
||
|
function splitpath() {
|
||
|
splitlsep2 "$1" / "${2:-dir}" "${3:-name}"
|
||
|
}
|
||
|
|
||
|
function: splitname "\
|
||
|
Découper \$1 de la forme basename[.ext] entre le nom de base du fichier, qui
|
||
|
est placé dans la variable \$2(=basename) et l'extension, qui est placée dans
|
||
|
la variable \$3(=ext)
|
||
|
|
||
|
Attention, si \$1 est un chemin, le résultat risque d'être faussé. Par exemple,
|
||
|
'splitname a.b/c' ne donne pas le résultat escompté."
|
||
|
function splitname() {
|
||
|
splitlsep "$1" . "${2:-basename}" "${3:-ext}"
|
||
|
}
|
||
|
|
||
|
function: splithost "\
|
||
|
Découper \$1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé
|
||
|
dans la variable \$2(=hostname) et le domaine, qui est placée dans la variable
|
||
|
\$3(=domain)"
|
||
|
function splithost() {
|
||
|
splitfsep "$1" . "${2:-hostname}" "${3:-domain}"
|
||
|
}
|
||
|
|
||
|
function: splituserhost "\
|
||
|
Découper \$1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé
|
||
|
dans la variable \$2(=user) et le nom d'hôte, qui est placée dans la variable
|
||
|
\$3(=host)"
|
||
|
function splituserhost() {
|
||
|
splitfsep2 "$1" @ "${2:-user}" "${3:-host}"
|
||
|
}
|
||
|
|
||
|
function: splitpair "\
|
||
|
Découper \$1 de la forme first[:second] entre la première valeur, qui est placé
|
||
|
dans la variable \$2(=src) et la deuxième valeur, qui est placée dans la variable
|
||
|
\$3(=dest)"
|
||
|
function splitpair() {
|
||
|
splitfsep "$1" : "${2:-src}" "${3:-dest}"
|
||
|
}
|
||
|
|
||
|
function: splitproxy "\
|
||
|
Découper \$1 de la forme http://[user:password@]host[:port]/ entre les valeurs
|
||
|
\$2(=host), \$3(=port), \$4(=user), \$5(=password)
|
||
|
|
||
|
S'il n'est pas spécifié, port vaut 3128 par défaut"
|
||
|
function splitproxy() {
|
||
|
local sy__tmp sy__host sy__port sy__creds sy__user sy__password
|
||
|
|
||
|
sy__tmp="${1#http://}"
|
||
|
if [[ "$sy__tmp" == *@* ]]; then
|
||
|
sy__creds="${sy__tmp%%@*}"
|
||
|
sy__tmp="${sy__tmp#${sy__creds}@}"
|
||
|
splitpair "$sy__creds" sy__user sy__password
|
||
|
fi
|
||
|
sy__tmp="${sy__tmp%%/*}"
|
||
|
splitpair "$sy__tmp" sy__host sy__port
|
||
|
[ -n "$sy__port" ] || sy__port=3128
|
||
|
|
||
|
setv "${2:-host}" "$sy__host"
|
||
|
setv "${3:-port}" "$sy__port"
|
||
|
setv "${4:-user}" "$sy__user"
|
||
|
setv "${5:-password}" "$sy__password"
|
||
|
}
|
||
|
|
||
|
function: spliturl "\
|
||
|
Découper \$1 de la forme scheme://[user:password@]host[:port]/path entre les
|
||
|
valeurs \$2(=scheme), \$3(=user), \$4(=password), \$5(=host), \$6(=port), \$7(=path)
|
||
|
|
||
|
S'il n'est pas spécifié, port vaut 80 pour http, 443 pour https, 21 pour ftp"
|
||
|
function spliturl() {
|
||
|
local sl__tmp sl__scheme sl__creds sl__user sl__password sl__host sl__port sl__path
|
||
|
|
||
|
sl__scheme="${1%%:*}"
|
||
|
sl__tmp="${1#${sl__scheme}://}"
|
||
|
if [[ "$sl__tmp" == */* ]]; then
|
||
|
sl__path="${sl__tmp#*/}"
|
||
|
sl__tmp="${sl__tmp%%/*}"
|
||
|
fi
|
||
|
if [[ "$sl__tmp" == *@* ]]; then
|
||
|
sl__creds="${sl__tmp%%@*}"
|
||
|
sl__tmp="${sl__tmp#${sl__creds}@}"
|
||
|
splitpair "$sl__creds" sl__user sl__password
|
||
|
fi
|
||
|
splitpair "$sl__tmp" sl__host sl__port
|
||
|
if [ -z "$sl__port" ]; then
|
||
|
[ "$sl__scheme" == "http" ] && sl__port=80
|
||
|
[ "$sl__scheme" == "https" ] && sl__port=443
|
||
|
[ "$sl__scheme" == "ftp" ] && sl__port=21
|
||
|
fi
|
||
|
|
||
|
setv "${2:-scheme}" "$sl__scheme"
|
||
|
setv "${3:-user}" "$sl__user"
|
||
|
setv "${4:-password}" "$sl__password"
|
||
|
setv "${5:-host}" "$sl__host"
|
||
|
setv "${6:-port}" "$sl__port"
|
||
|
setv "${7:-path}" "$sl__path"
|
||
|
}
|
||
|
|
||
|
function: splitwcs "\
|
||
|
Découper un nom de chemin \$1 entre la partie sans wildcards, qui est placée dans
|
||
|
la variables \$2(=basedir), et la partie avec wildcards, qui est placée dans la
|
||
|
variable \$3(=filespec)"
|
||
|
function splitwcs() {
|
||
|
local ss__p="$1"
|
||
|
local ss__dd="${2:-basedir}" ss__df="${3:-filespec}" ss__part ss__d ss__f
|
||
|
local -a ss__parts
|
||
|
array_split ss__parts "$ss__p" "/"
|
||
|
for ss__part in "${ss__parts[@]}"; do
|
||
|
if [[ "$ss__part" == *\** ]] || [[ "$ss__part" == *\?* ]] || [ -n "$ss__f" ]; then
|
||
|
ss__f="${ss__f:+$ss__f/}$ss__part"
|
||
|
else
|
||
|
ss__d="${ss__d:+$ss__d/}$ss__part"
|
||
|
fi
|
||
|
done
|
||
|
[ "${ss__p#/}" != "$ss__p" ] && ss__d="/$ss__d"
|
||
|
_setv "$ss__dd" "$ss__d"
|
||
|
_setv "$ss__df" "$ss__f"
|
||
|
}
|