Ich habe viele verschiedene Lösungen ausprobiert. Eine gute Ressource mit Hintergrundinformationen und Alternativen ist beispielsweise BashFAQ / 096 in Gregs (auch bekannt als GreyCats) Wiki . Insgesamt fand ich die folgenden zwei am besten lesbar (von den funktionierenden):
Seit Bash 4.4 (soweit ich aus den NEWS ersehen kann ) ist es möglich, die Parametererweiterung @Q
wie folgt zu verwenden :
adb sh -c "other_tool -a -b ${*@Q}"
Beachten Sie, dass ich $*
hier anstelle von verwende, $@
weil Sie "other_tool -a -b ${*@Q}"
eine einzelne Zeichenfolge anstelle einer Zeichenfolge pro übergebenem Argument sein möchten .
Wenn Sie dasselbe mit einer Bash-Array-Variablen tun möchten, benötigen Sie die Syntax ${ARRAY[*]@Q}
(innerhalb der Anführungszeichen).
Wenn Sie Bash 4.4 oder höher nicht verfügbar haben oder sich nicht sicher sind, ist dies meine bevorzugte Lösung:
function escapeBashArgs() {
local arg separator=""
for arg
do
printf "%s%q" "$separator" "$arg"
separator=" "
done
}
adb sh -c "other_tool -a -b $(escapeBashArgs "$@")"
Beachten Sie, dass Sie hier "$@"
anstelle von $@
oder "$*"
oder verwenden müssen, $*
weil Sie keine Wortaufteilung innerhalb von Argumenten wünschen, sodass die Varianten ohne Anführungszeichen nicht verwendet werden können und die Anzahl der Argumente beibehalten werden soll, sodass "$*"
sie nicht so verwendet werden können, wie sie sich verbinden würden alle Argumente zu einer einzelnen Zeichenfolge. Die Funktion gibt dann alle Argumente in einer einzelnen Zeichenfolge zurück.
Wenn Sie nicht über den zusätzlichen Raum vor dem ersten Argument ist es egal, können Sie das ändern printf
Formatstring " %q"
und die entfernen separator
Variable. Oder Sie können den Einzeiler von Gordon Davissons Antwort verwenden .
Diese Lösungen funktionieren in allen Fällen, die mir einfallen könnten, insbesondere:
- Keine Argumente:
escapeBashArgs
→ nichts
- Leere Argumente:
escapeBashArgs "" ""
→'' ''
- Argumente mit nur Leerzeichen:
escapeBashArgs " " " "
→ ' ' ' '
oder \ \ \ \ \
( das letzte Leerzeichen wird von diesem Site-Renderer gegessen )
- Argumente mit speziellen Abständen und Zeilenumbrüchen:
escapeBashArgs "a b" c\ d "arg with
newline"
→ 'a b' 'c d' $'arg with\nnewline'
oder a\ \ \ \ \ \ b c\ d $'arg with\nnewline'
( die Zeilenumbruchstelle befindet sich zwischen with
und newline
an anderen Positionen liegt dies am Zeilenumbruch auf dieser Site )
- Argumente mit Sonderzeichen:
escapeBashArgs '$"'\''({:})'
→ '$"'\''({:})'
oder\$\"\'\(\{:\}\)
- Beispiel von jcayzacs Antwort :
escapeBashArgs x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
→ 'x/ "b"/aaaaa/'\''xxx yyyy'\''/zz"offf"'
oderx/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
(Getestet mit GNU Bash 5.0.3 (1) -Release.)