diff --git a/ulib/base b/ulib/base index bd682ed..94da395 100644 --- a/ulib/base +++ b/ulib/base @@ -31,8 +31,102 @@ export TMPDIR="${TMPDIR:-${TMP:-${TEMP:-/tmp}}}" [ -f ~/.nutoolsrc ] && . ~/.nutoolsrc ################################################################################ -## valeurs +## core +function recho() { +# afficher une valeur brute. contrairement à la commande echo, ne reconnaitre +# aucune option (i.e. -e, -E, -n ne sont pas signifiants) + if [[ "${1:0:2}" == -[eEn] ]]; then + echo -n - + local first="${1:1}"; shift + echo "$first" "$@" + else + echo "$*" + fi +} +function recho_() { +# afficher une valeur brute, sans passer à la ligne. contrairement à la commande +# echo, ne reconnaitre aucune option (i.e. -e, -E, -n ne sont pas signifiants) + if [[ "${1:0:2}" == -[eEn] ]]; then + echo -n - + local first="${1:1}"; shift + echo -n "$first" "$@" + else + echo -n "$*" + fi +} +function qval() { +# Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \` +# Cela permet de quoter une chaine à mettre entre guillements. note: la +# protection de ! n'est pas effectuée, parce que le comportement du shell est +# incohérent entre le shell interactif et les scripts. Pour une version plus +# robuste, il est nécessaire d'utiliser un programme externe tel que sed ou awk + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + recho_ "$s" +} +function should_quote() { +# Tester si la chaine $* doit être mise entre quotes + [ -z "$1" ] && return 0 + local s="${*//[a-zA-Z0-9]/}" + s="${s//,/}" + s="${s//./}" + s="${s//+/}" + s="${s//\//}" + s="${s//-/}" + s="${s//_/}" + s="${s//=/}" + [ -n "$s" ] +} +function qvals() { +# Afficher chaque argument de cette fonction quotée le cas échéant avec " +# Chaque valeur est séparée par un espace. + local arg first=1 + for arg in "$@"; do + [ -z "$first" ] && echo -n " " + if should_quote "$arg"; then + echo -n \" + qv "$arg" + echo -n \" + else + recho_ "$arg" + fi + first= + done +} +function qlines() { +# Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées +# avec ' + sed "s/'/'\\\\''/g; s/.*/'&'/g" +} +function setv() { +# initialiser la variable $1 avec la valeur $2..* + local __s_var="$1"; shift + eval "$__s_var=\"$(qval "$*")\"" +} +function setx() { +# initialiser la variable $1 avec le résultat de la commande '$2..@' + local __s_var="$1"; shift + eval "$__s_var=\"\$(\"\$@\")\"" +} +function seta() { +# initialiser le tableau $1 avec le résultat de la commande '$2..@', chaque +# ligne du résultat étant un élément du tableau + local __s_array="$1"; shift + eval "$__s_array=($("$@" | qlines))" +} +function e2of() { +# lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard + "$@" 2>&1 +} +function nef() { +# lancer la commande $@ et filtrer du résultat toutes les lignes vides + "$@" | sed '/^$/d' +} +## valeurs function isnum() { # retourner vrai si $1 est une valeur numérique entière (positive ou négative) [ ${#1} -gt 0 ] || return 1 @@ -61,14 +155,10 @@ function isrnum() { } function is_yes() { # retourner vrai si $1 est une valeur "oui" - [ "$1" == "o" -o "$1" == "O" -o "$1" == "oui" -o "$1" == "OUI" ] && return 0 - [ "$1" == "y" -o "$1" == "Y" -o "$1" == "yes" -o "$1" == "YES" ] && return 0 - [ "$1" == "v" -o "$1" == "V" -o "$1" == "vrai" -o "$1" == "VRAI" ] && return 0 - [ "$1" == "t" -o "$1" == "T" -o "$1" == "true" -o "$1" == "TRUE" ] && return 0 - [ "$1" == "on" -o "$1" == "ON" ] && return 0 - if isnum "$1"; then - [ "$1" -ne 0 ] && return 0 - fi + case "${1,,}" in + o|oui|y|yes|v|vrai|t|true|on) return 0;; + esac + isnum "$1" && [ "$1" -ne 0 ] && return 0 return 1 } function yesval() { @@ -95,14 +185,10 @@ function normyesvals() { } function is_no() { # retourner vrai si $1 est une valeur "non" - [ "$1" == "n" -o "$1" == "N" -o "$1" == "non" -o "$1" == "NON" ] && return 0 - [ "$1" == "no" -o "$1" == "NO" ] && return 0 - [ "$1" == "f" -o "$1" == "F" -o "$1" == "faux" -o "$1" == "FAUX" ] && return 0 - [ "$1" == "false" -o "$1" == "FALSE" ] && return 0 - [ "$1" == "off" -o "$1" == "OFF" ] && return 0 - if isnum "$1"; then - [ "$1" -eq 0 ] && return 0 - fi + case "${1,,}" in + n|non|no|f|faux|false|off) return 0;; + esac + isnum "$1" && [ "$1" -eq 0 ] && return 0 return 1 } function rawecho() { @@ -141,18 +227,6 @@ function quote_arg() { s="${s//\`/\\\`}" rawecho "$s" } -function should_quote() { - [ -z "$1" ] && return 0 - local s="${1//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} function quoted_arg() { # Dans la chaine $1, remplacer \ par \\, " par \" et $ par \$, et afficher la # chaine entourée de guillemets, si nécessaire