私は多くの異なる解決策を試しました。背景情報や代替案を含む優れたリソースは、たとえばGreg(別名GreyCat)WikiのBashFAQ / 096です。まとめると、次の2つが(動作するものから)最も読みやすいとわかりました。
Bash 4.4以降(私がNEWSからわかる範囲で)、次のようにパラメーター展開 を使用することが可能@Qです。
adb sh -c "other_tool -a -b ${*@Q}"
渡された引数ごとに1つの文字列ではなく1つの文字列になりたいので、$*ここでは代わりにここを使用しています。$@"other_tool -a -b ${*@Q}"
bash配列変数を使用して同じことを行う場合は、${ARRAY[*]@Q}(引用符内の)構文が必要です。
あなたがいる場合バッシュ4.4以降が利用できていないかわからない、これは私の好みのソリューションです。
function escapeBashArgs() {
local arg separator=""
for arg
do
printf "%s%q" "$separator" "$arg"
separator=" "
done
}
adb sh -c "other_tool -a -b $(escapeBashArgs "$@")"
ここにあなたが使用する必要があることを注意"$@"の代わりに、$@または"$*"あるいは$*引用なしの変異体を使用することができない、とあなたは引数の数が保存されるようにしたいので、あなたは、引数内の単語分割をしたくないので"$*"、それは参加するだろうとして使用することはできません単一の文字列へのすべての引数。その後、関数はすべての引数を単一の文字列で返します。
最初の引数の前の追加スペースを気にしない場合は、printfフォーマット文字列をに変更して" %q"、separator変数を削除できます。または、Gordon Davissons answerのワンライナーを使用することもできます。
この解決策は、私が思いつく可能性のあるすべてのケースで機能します。特に:
- 引数なし:
escapeBashArgs→ なし
- 空の引数:
escapeBashArgs "" ""→'' ''
- スペースのみの引数:
escapeBashArgs " " " "→ ' ' ' 'または\ \ \ \ \(最後のスペースはこのサイトレンダラーによって使用されます)
- 特別な間隔と改行のある引数:
escapeBashArgs "a b" c\ d "arg with
newline"→ 'a b' 'c d' $'arg with\nnewline'またはa\ \ \ \ \ \ b c\ d $'arg with\nnewline'(改行はとの間にwithあります。newline他の位置では、このサイトでの行の折り返しが原因です)
- 特殊文字を含む引数:
escapeBashArgs '$"'\''({:})'→ '$"'\''({:})'または\$\"\'\(\{:\}\)
- jcayzacs回答の例:
escapeBashArgs x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"→ 'x/ "b"/aaaaa/'\''xxx yyyy'\''/zz"offf"'またはx/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
(GNU bash 5.0.3(1)-releaseでテストされています。)