supprimer _rval(), remplacer par qwc()

This commit is contained in:
Jephte CLAIN 2014-12-26 16:58:58 +04:00
parent a3e647ee6a
commit 3ff7f78d0b
3 changed files with 57 additions and 27 deletions

View File

@ -1 +1 @@
007013002
007014000

View File

@ -1304,7 +1304,7 @@ function __la_cmd() {
local arg
local cmd="/bin/ls -1d"
for arg in "$@"; do
arg="$(_rval "$arg")"
arg="$(qwc "$arg")"
cmd="$cmd $arg"
done
cmd="$cmd 2>/dev/null"

View File

@ -29,31 +29,6 @@ function recho_() {
echo -n "$@"
fi
}
function _rval() {
# Dans la chaine $*, remplacer \ par \\, " par \", ' par \', ( par \(, ) par \),
# { par \{, } par \}, [ par \[, ] par \], $ par \$, ` par \`, SPACE par \SPACE
# Cela permet de quoter une chaine à afficher telle quelle, sans guillemets, e.g
# eval "echo $(_rval "$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
local s="$*"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//\'/\'}"
s="${s//\(/\(}"
s="${s//\)/\)}"
s="${s//\{/\{}"
s="${s//\}/\}}"
s="${s//\[/\[}"
s="${s//\]/\]}"
s="${s//\$/\\\$}"
s="${s//\`/\\\`}"
s="${s// /\\ }"
recho_ "$s"
}
function _qval() {
# Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`
# Cela permet de quoter une chaine à mettre entre guillements.
@ -129,6 +104,61 @@ function qvals() {
done
[ -z "$first" ] && echo
}
function qwc() {
# Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis
# quoter la chaine avec ", sauf les wildcards * et ?
# 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
local s="$*"
s="${s//\\/\\\\}"
s="${s//\"/\\\"}"
s="${s//\$/\\\$}"
s="${s//\`/\\\`}"
local r a b
while [ -n "$s" ]; do
if [[ "$s" == *\** ]]; then
if [[ "$s" == *\?* ]]; then
a="${s%%\**}"
b="${s%%\?*}"
if [ ${#a} -lt ${#b} ]; then
s="${s#*\*}"
r="$r\"$a\"*"
else
s="${s#*\?}"
r="$r\"$b\"?"
fi
else
a="${s%%\**}"
s="${s#*\*}"
r="$r\"$a\"*"
fi
elif [[ "$s" == *\?* ]]; then
if [[ "$s" == *\** ]]; then
a="${s%%\**}"
b="${s%%\?*}"
if [ ${#a} -lt ${#b} ]; then
s="${s#*\*}"
r="$r\"$a\"*"
else
s="${s#*\?}"
r="$r\"$b\"?"
fi
else
a="${s%%\?*}"
s="${s#*\?}"
r="$r\"$a\"?"
fi
else
r="$r\"$s\""
break
fi
done
recho_ "$r"
}
function qlines() {
# Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées
# avec '