यदि, ऑफ-मौके पर, आप केवल शेल के पुन: उपयोग के लिए उद्धरणों को संभालने की कोशिश कर रहे हैं, तो आप उन्हें हटाए बिना भी ऐसा कर सकते हैं , और यह आसान भी है:
aq() { sh -c 'for a do
alias "$((i=$i+1))=$a"
done; alias' -- "$@"
}
यह फ़ंक्शन शेल आपके द्वारा हाथ किए गए किसी भी आर्ग सरणी को उद्धृत करता है और इसके आउटपुट को पुनरावृत्त तर्क में बढ़ाता है।
यहाँ यह कुछ args के साथ है:
aq \
"here's an
ugly one" \
"this one is \$PATHpretty bad, too" \
'this one```****```; totally sucks'
आउटपुट
1='here'"'"'s an
ugly one'
2='this one is $PATHpretty bad, too'
3='this one```****```; totally sucks'
वह आउटपुट है dash
जिसमें से आमतौर पर सुरक्षित-उद्धरण एकल-उद्धृत आउटपुट जैसे होते हैं '"'"'
। bash
करेगा '\''
।
एकल, गैर-व्हाट्सएप, गैर-नल बाइट्स के चयन को किसी अन्य एकल बाइट के साथ बदलने से संभवतः किसी भी POSIX शेल में $IFS
और उसके साथ सबसे तेज किया जा सकता है $*
।
set -f; IFS=\"\'\`; set -- $var; printf %s "$*"
आउटपुट
"some ""crazy """"""""string ""here
वहाँ मैं सिर्फ printf
इतना है कि आप इसे देख सकते हैं, लेकिन निश्चित रूप से, अगर मैंने किया था:
var="$*"
... इसके बजाय printf
कमांड $var
का मूल्य वही होगा जो आप वहां के आउटपुट में देखते हैं।
जब मैं set -f
शेल को ग्लोब नहीं करने का निर्देश देता हूं - यदि स्ट्रिंग में ऐसे अक्षर हैं जो ग्लोब पैटर्न के रूप में रखे जा सकते हैं। मैं ऐसा करते हैं क्योंकि गोले पार्सर फैलता पैटर्न glob के बाद यह चर पर क्षेत्र बंटवारे प्रदर्शन करती है। ग्लोबिंग को फिर से सक्षम किया जा सकता है set +f
। सामान्य तौर पर - लिपियों में - मुझे अपने बैंग को सेट करने के लिए उपयोगी लगता है जैसे:
#!/usr/bin/sh -f
और फिर स्पष्ट रूप से सक्षम करने के लिएset +f
जो कुछ भी मैं यह चाहता हूँ पर लाइन के साथ ।
फ़ील्ड विभाजन विभाजन वर्णों के आधार पर होता है $IFS
।
$IFS
मूल्य दो प्रकार के होते हैं- $IFS
व्हॉट्सएप और $IFS
नॉन-व्हाट्सएप। $IFS
व्हाट्सएप (स्पेस, टैब, न्यूलाइन) सीमांकित क्षेत्रों को एक ही क्षेत्र के अनुक्रम के साथ निर्दिष्ट करने के लिए निर्दिष्ट किया जाता है (या यदि वे पहले से कुछ और नहीं करते हैं) - तो ...
IFS=\ ; var=' '; printf '<%s>' $var
<>
लेकिन सभी अन्य लोग प्रति घटना के लिए एक ही क्षेत्र का मूल्यांकन करने के लिए निर्दिष्ट होते हैं - वे काटे नहीं जाते हैं।
IFS=/; var='/////'; printf '<%s>' $var
<><><><><>
सभी चर विस्तार डिफ़ॉल्ट रूप से, $IFS
डेटा सीमांकित हैं - वे अलग-अलग फ़ील्ड के अनुसार विभाजित होते हैं $IFS
। जब आप "
-quote करते हैं, तो आप उस एरे प्रॉपर्टी को ओवरराइड करते हैं और इसे सिंगल स्ट्रिंग के रूप में मूल्यांकित करते हैं।
तो जब मैं करता हूँ ...
IFS=\"\'\`; set -- $var
मैं विस्तार से $IFS
उत्पन्न कई सीमांकित क्षेत्रों में शेल के तर्क सरणी को सेट कर रहा हूं $var
। जब इसे विस्तारित किया जाता है तो इसमें निहित पात्रों के लिए अपने मूल्यों $IFS
को खो दिया जाता है - वे अब केवल क्षेत्र विभाजक हैं - वे हैं \0NUL
।
"$*"
- अन्य दोहरे-अवतरण चर-विस्तार की तरह - के क्षेत्र-विभाजन गुणों को भी ओवरराइड करता है $IFS
। लेकिन, इसके अलावा , यह $IFS
प्रत्येक सीमांकित क्षेत्र के लिए पहली बाइट को प्रतिस्थापित करता है "$@"
। तो क्योंकि "
था पहले मूल्य में $IFS
बाद के सभी सीमांकक बन "
में "$*"
। और "
जरूरत नहीं है $IFS
जब आप इसे या तो विभाजित करते हैं। आप पूरी तरह से एक और मूल्य के $IFS
बाद बदल सकते हैं set -- $args
और इसकी नई पहली बाइट तब क्षेत्र में सीमांकक के लिए दिखाई देगी "$*"
। क्या अधिक है, आप उनमें से सभी निशान पूरी तरह से हटा सकते हैं:
set -- $var; IFS=; printf %s "$*"
आउटपुट
some crazy string here
tr
। BASH का PE अच्छा है लेकिन इस मामले में tr ज्यादा तेज है। उदाहरण के लिएecho "$OUTPUT" | tr -dc '[[:alpha:]]'
जब से आप केवल अल्फ़ान्यूमेरिक्स करना चाहते हैं