मैंने कई अलग-अलग समाधानों की कोशिश की, पृष्ठभूमि जानकारी और विकल्पों सहित एक अच्छा संसाधन उदाहरण के लिए है ग्रेग (उर्फ। ग्रेकैट के) विकी पर BashFAQ / 096 । कुल मिलाकर मुझे निम्नलिखित दो सबसे अधिक पठनीय लगे (काम करने वालों से):
चूँकि Bash 4.4 (जहाँ तक मैं NEWS से बता सकता हूँ ) इस तरह के पैरामीटर विस्तार का उपयोग करना संभव है @Q
:
adb sh -c "other_tool -a -b ${*@Q}"
ध्यान दें कि मैं $*
यहाँ का उपयोग करता हूँ $@
क्योंकि आप "other_tool -a -b ${*@Q}"
एक स्ट्रिंग के बजाय एक सिंगल स्ट्रिंग होना चाहते हैं ।
यदि आप बैश एरे चर के साथ भी ऐसा ही करना चाहते हैं तो आपको सिंटैक्स ${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
हैं। या आप गॉर्डन डेविसन्स जवाब से वन-लाइनर का उपयोग कर सकते हैं ।
यह समाधान उन सभी मामलों के साथ काम करता है जो मैं विशेष रूप से कर सकता हूं:
- कोई तर्क नहीं:
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 बैश 5.0.3 (1) -release के साथ परीक्षण किया गया।)