Ma version
strip_quotes() {
while [[ $# -gt 0 ]]; do
local value=${!1}
local len=${#value}
[[ ${value:0:1} == \" && ${value:$len-1:1} == \" ]] && declare -g $1="${value:1:$len-2}"
shift
done
}
La fonction accepte le(s) nom(s) de variable(s) et supprime les guillemets à la place. Elle supprime uniquement une paire de guillemets ouvrants et fermants. Elle ne vérifie pas si le guillemet de fin est échappé (précédé de \
qui n'est pas lui-même échappé).
D'après mon expérience, les fonctions utilitaires de chaînes de caractères à usage général comme celle-ci (j'en ai une bibliothèque) sont plus efficaces lorsqu'elles manipulent directement les chaînes de caractères, sans utiliser de correspondance de motifs et surtout sans créer de sous-shells, ni appeler d'outils externes tels que sed
, awk
o grep
.
var1="\"test \\ \" end \""
var2=test
var3=\"test
var4=test\"
echo before:
for i in var{1,2,3,4}; do
echo $i="${!i}"
done
strip_quotes var{1,2,3,4}
echo
echo after:
for i in var{1,2,3,4}; do
echo $i="${!i}"
done
0 votes
Je suggère d'utiliser
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Cette syntaxe ne supprime les qoutes que lorsqu'il existe une paire correspondante.0 votes
@JohnSmith Je dois également échapper automatiquement aux guillemets dans un shell script, mais je dois le faire qu'ils correspondent ou non, donc je n'utiliserai probablement pas l'expression que vous avez postée.
0 votes
Si vous avez trouvé cette question en voulant simplement supprimer toutes les citations, voyez cette réponse : askubuntu.com/a/979964/103498 .