Birçok farklı çözüm denedim, arka plan bilgileri ve alternatifler de dahil olmak üzere iyi bir kaynak, örneğin Greg'in (aka. GreyCat'ın) Wiki'sinde BashFAQ / 096 . Toplamda aşağıdaki ikisinin en okunabilir olduğunu gördüm (çalışanlardan):
Bash 4.4'ten beri ( HABERLERDEN anlatabildiğim kadarıyla ) parametre genişletmeyi şu şekilde kullanmak mümkündür @Q:
adb sh -c "other_tool -a -b ${*@Q}"
$*Burada yerine kullanılan her argüman için bir dize yerine tek bir dize olmasını $@istediğiniz "other_tool -a -b ${*@Q}"için kullanın.
Aynı şeyi bir bash dizi değişkeni ile yapmak istiyorsanız sözdizimine ${ARRAY[*]@Q}(tırnak içinde) ihtiyacınız olacaktır .
Eğer varsa Bash 4.4 veya daha sonra mevcut olmayan veya emin değilseniz, bu benim tercih çözümdür:
function escapeBashArgs() {
local arg separator=""
for arg
do
printf "%s%q" "$separator" "$arg"
separator=" "
done
}
adb sh -c "other_tool -a -b $(escapeBashArgs "$@")"
Not Burada bu kullanmak gerekmez "$@"yerine $@veya "$*"veya $*kullanılamaz alıntı olmadan varyantları böylece, argümanlar içinde kelime bölme istemiyoruz ve bunu, argüman sayısı korunacak istiyorum, çünkü "$*"o katılacağını olarak kullanılamaz tüm argümanlar tek bir dizeye. İşlev daha sonra tüm bağımsız değişkenleri tek bir dizede döndürür.
İlk bağımsız değişkenin önündeki ek boşluğu önemsemiyorsanız, printfbiçim dizesini değişken olarak değiştirebilir " %q"ve kaldırabilirsiniz separator. Veya Gordon Davissons'ın cevabındaki tek astarı kullanabilirsiniz .
Bu çözümler, özellikle karşılaşabileceğim tüm vakalarla çalışır:
- Argüman yok:
escapeBashArgs→ hiçbir şey
- Boş argümanlar:
escapeBashArgs "" ""→'' ''
- Sadece boşluklu argümanlar:
escapeBashArgs " " " "→ ' ' ' 'veya \ \ \ \ \( son alan bu site oluşturucu tarafından yenilir )
- Özel boşluk ve yeni satır içeren bağımsız değişkenler:
escapeBashArgs "a b" c\ d "arg with
newline"→ 'a b' 'c d' $'arg with\nnewline'veya a\ \ \ \ \ \ b c\ d $'arg with\nnewline'( satırsonu arasında withve newlinediğer konumlarda bu sitedeki satır kaydırma nedeniyle )
- Özel karakterli bağımsız değişkenler:
escapeBashArgs '$"'\''({:})'→ '$"'\''({:})'veya\$\"\'\(\{:\}\)
- Jcayzacs cevap örneği :
escapeBashArgs x/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"→ 'x/ "b"/aaaaa/'\''xxx yyyy'\''/zz"offf"'veyax/\ \ \"b\"/aaaaa/\'xxx\ yyyy\'/zz\"offf\"
(GNU bash 5.0.3 (1) -release ile test edilmiştir.)