# sinon, tester si la chaine contient des caractères spéciaux
locals="$*"
s="${s//[a-zA-Z0-9]/}"
s="${s//,/}"
s="${s//./}"
s="${s//+/}"
s="${s//\//}"
s="${s//-/}"
s="${s//_/}"
s="${s//=/}"
[ -n "$s"]
}
function: qval "Afficher la chaine \$* quotée avec \""
function qval(){
echo -n \"
_qval "$@"
echo\"
}
function: qvalm "Afficher la chaine \$* quotée si nécessaire avec \""
function qvalm(){
if base_should_quote "$@";then
echo -n \"
_qval "$@"
echo\"
else
recho "$@"
fi
}
function: qvalr "Afficher la chaine \$* quotée si nécessaire avec \", sauf si elle est vide"
function qvalr(){
if[ -z "$*"];then
:
elif base_should_quote "$@";then
echo -n \"
_qval "$@"
echo\"
else
recho "$@"
fi
}
function: qvals "Afficher chaque argument de cette fonction quotée le cas échéant avec \", chaque valeur étant séparée par un espace"
function qvals(){
local arg first=1
for arg in "$@";do
[ -z "$first"]&&echo -n " "
if base_should_quote "$arg";then
echo -n \"
_qval "$arg"
echo -n \"
else
recho_ "$arg"
fi
first=
done
[ -z "$first"]&&echo
}
function: qwc "Dans la chaine \$*, remplacer:
~~~
\\ par \\\\
\" par \\\"
\$ par \\\$
\` par \\\`
~~~
puis quoter la chaine avec \", sauf les wildcards *, ? et [class]
Cela permet de quoter une chaine permettant de glober des fichiers, e.g
~~~
eval\"ls \$(qwc \"\$value\")\"
~~~
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"
function qwc(){
locals="$*"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//\$/\\\$}"
s="${s//\`/\\\`}"
local r a b c
while[ -n "$s"];do
a=;b=;c=
a=;[["$s"== *\** ]]&&{a="${s%%\**}";a=${#a};}
b=;[["$s"== *\?* ]]&&{b="${s%%\?*}";b=${#b};}
c=;[["$s"== *\[* ]]&&{c="${s%%\[*}";c=${#c};}
if[ -z "$a" -a -z "$b" -a -z "$c"];then
r="$r\"$s\""
break
fi
if[ -n "$a"];then
[ -n "$b"]&&[$a -lt $b]&&b=
[ -n "$c"]&&[$a -lt $c]&&c=
fi
if[ -n "$b"];then
[ -n "$a"]&&[$b -lt $a]&&a=
[ -n "$c"]&&[$b -lt $c]&&c=
fi
if[ -n "$c"];then
[ -n "$a"]&&[$c -lt $a]&&a=
[ -n "$b"]&&[$c -lt $b]&&b=
fi
if[ -n "$a"];then# PREFIX*
a="${s%%\**}"
s="${s#*\*}"
[ -n "$a"]&&r="$r\"$a\""
r="$r*"
elif[ -n "$b"];then# PREFIX?
a="${s%%\?*}"
s="${s#*\?}"
[ -n "$a"]&&r="$r\"$a\""
r="$r?"
elif[ -n "$c"];then# PREFIX[class]
a="${s%%\[*}"
b="${s#*\[}";b="${b%%\]*}"
s="${s:$((${#a}+${#b}+2))}"
[ -n "$a"]&&r="$r\"$a\""
r="$r[$b]"
fi
done
recho_ "$r"
}
function: qlines "Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées avec '"
function qlines(){
sed "s/'/'\\\\''/g; s/.*/'&'/g"
}
function: setv "initialiser la variable \$1 avec la valeur \$2..*
note: en principe, la syntaxe est 'setv var values...'. cependant, la syntaxe 'setv var=values...' est supportée aussi"
function setv(){
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
fi
eval"$s__var=\"\$*\""
}
function: _setv "Comme la fonction setv() mais ne supporte que la syntaxe '_setv var values...'
Cette fonction est légèrement plus rapide que setv()"
function _setv(){
locals__var="$1";shift
eval"$s__var=\"\$*\""
}
function: echo_setv "Afficher la commande qui serait lancée par setv \"\$@\""
function echo_setv(){
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
fi
echo"$s__var=$(qvalr "$*")"
}
function: echo_setv2 "Afficher la commande qui recrée la variable \$1.
Equivalent à
~~~
echo_setv \"\$1=\${!1}\"
~~~
Si d'autres arguments que le nom de la variable sont spécifiés, cette fonction
se comporte comme echo_setv()"
function echo_setv2(){
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
fi
if[$# -eq 0];then
echo_setv "$s__var""${!s__var}"
else
echo_setv "$s__var""$@"
fi
}
function: seta "initialiser le tableau \$1 avec les valeurs \$2..@
note: en principe, la syntaxe est 'seta array values...'. cependant, la syntaxe
'seta array=values...' est supportée aussi"
function seta(){
locals__array="$1";shift
if[["$s__array"== *=* ]];then
set -- "${s__array#*=}""$@"
s__array="${s__array%%=*}"
fi
eval"$s__array=(\"\$@\")"
}
function: _seta "Comme la fonction seta() mais ne supporte que la syntaxe '_seta array values...'
Cette fonction est légèrement plus rapide que seta()"
function _seta(){
locals__array="$1";shift
eval"$s__array=(\"\$@\")"
}
function: echo_seta "Afficher la commande qui serait lancée par seta \"\$@\""
function echo_seta(){
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
fi
echo"$s__var=($(qvals "$@"))"
}
function: echo_seta2 "Afficher la commande qui recrée le tableau \$1
Si d'autres arguments que le nom de tableau sont spécifiés, cette fonction se
comporte comme echo_seta()"
function echo_seta2(){
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
elif[$# -eq 0];then
eval"set -- \"\${$s__var[@]}\""
fi
echo"$s__var=($(qvals "$@"))"
}
function: setx "Initialiser une variable avec le résultat d'une commande
* syntaxe 1: initialiser la variable \$1 avec le résultat de la commande \"\$2..@\"
~~~
setx var cmd
~~~
note: en principe, la syntaxe est 'setx var cmd args...'. cependant, la syntaxe
'setx var=cmd args...' est supportée aussi
* syntaxe 2: initialiser le tableau \$1 avec le résultat de la commande
\"\$2..@\", chaque ligne du résultat étant un élément du tableau
~~~
setx -a array cmd
~~~
note: en principe, la syntaxe est 'setx -a array cmd args...'. cependant, la
syntaxe 'setx -a array=cmd args...' est supportée aussi"
function setx(){
if["$1"== -a ];then
shift
locals__array="$1";shift
if[["$s__array"== *=* ]];then
set -- "${s__array#*=}""$@"
s__array="${s__array%%=*}"
fi
eval"$s__array=($("$@"| qlines))"
else
locals__var="$1";shift
if[["$s__var"== *=* ]];then
set -- "${s__var#*=}""$@"
s__var="${s__var%%=*}"
fi
eval"$s__var="'"$("$@")"'
fi
}
function: _setvx "Comme la fonction setx() mais ne supporte que l'initialisation d'une variable scalaire avec la syntaxe '_setvx var cmd args...' pour gagner (un peu) en rapidité d'exécution."
function _setvx(){
locals__var="$1";shift
eval"$s__var="'"$("$@")"'
}
function: _setax "Comme la fonction setx() mais ne supporte que l'initialisation d'un tableau avec la syntaxe '_setax array cmd args...' pour gagner (un peu) en rapidité d'exécution."
function _setax(){
locals__array="$1";shift
eval"$s__array=($("$@"| qlines))"
}
function: base_is_defined "tester si la variable \$1 est définie"
function base_is_defined(){
[ -n "$(declare -p "$1" 2>/dev/null)"]
}
function: base_is_array "tester si la variable \$1 est un tableau"