Meine 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
}
Die Funktion akzeptiert Variablennamen und setzt Anführungszeichen an deren Stelle. Sie entfernt nur ein übereinstimmendes Paar von führenden und nachgestellten Anführungszeichen. Sie prüft nicht, ob das abschließende Anführungszeichen escaped ist (vorangestellt durch \
die selbst nicht escaped ist).
Meiner Erfahrung nach sind Allzweck-String-Utility-Funktionen wie diese (ich habe eine ganze Bibliothek davon) am effizientesten, wenn sie die Strings direkt manipulieren, keinen Musterabgleich verwenden und insbesondere keine Sub-Shells erstellen oder externe Tools wie 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 Stimmen
Ich würde vorschlagen, dass Sie
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Diese Syntax entfernt Qoutes nur, wenn es ein passendes Paar gibt.0 Stimmen
@JohnSmith Ich muss auch automatisch Anführungszeichen in einem Shell-Skript entschlüsseln, aber ich muss das tun, egal ob sie übereinstimmen oder nicht, also werde ich den von Ihnen geposteten Ausdruck wahrscheinlich nicht verwenden.
0 Stimmen
Wenn Sie diese Frage gefunden haben und einfach alle Anführungszeichen entfernen wollen, lesen Sie diese Antwort: askubuntu.com/a/979964/103498 .