Я спробував багато різних рішень, хорошим ресурсом, включаючи довідкову інформацію та альтернативи, є, наприклад, BashFAQ / 096 на Вікі Грега (ака. GreyCat's) . Всього я виявив наступні два найбільш читабельні (з робочих):
Оскільки Bash 4.4 (наскільки я міг сказати з НОВИНИ ), можна використовувати розширення параметрів @Q так:
adb sh -c "other_tool -a -b ${*@Q}"
Зауважте, що я використовую $*тут замість того, $@що ви хочете "other_tool -a -b ${*@Q}"бути одним єдиним рядком замість одного рядка за переданим аргументом.
Якщо ви хочете зробити те ж саме зі змінною масиву bash, вам знадобиться синтаксис ${ARRAY[*]@Q}(у лапках).
Якщо у вас немає Bash 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змінну. Або ви можете скористатися однолінійкою з відповіді Гордона Девіссона .
Це рішення працює у всіх випадках, з якими я міг зійти, особливо:
- Ніяких аргументів:
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.)