रिक्त स्थान के साथ एकल स्ट्रिंग में बैश तर्क को जोड़ना


39

मैं बैश फ़ंक्शन के सभी तर्कों को एक एकल स्ट्रिंग में प्रत्येक तर्क को अलग करने वाले रिक्त स्थान के साथ जुड़ने की कोशिश कर रहा हूं। मैं भी स्ट्रिंग पूरे स्ट्रिंग के आसपास एकल उद्धरण शामिल करने की आवश्यकता है।

यह है, जो कि अभी तक मेरे पास है...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

जाहिर है कि यह काम नहीं करता है लेकिन मैं सोच रहा हूं कि क्या इसे हासिल करने का कोई तरीका है?

जवाबों:


54

मेरा मानना ​​है कि यह वही करता है जो आप चाहते हैं। यह सभी तर्कों को एक स्ट्रिंग में रखेगा, रिक्त स्थान द्वारा अलग किया जाएगा, चारों ओर एकल उद्धरण के साथ:

str="'$*'"

$*$IFSडिफ़ॉल्ट रूप से, जिसके पहले चरित्र द्वारा अलग किए गए सभी स्क्रिप्ट तर्क उत्पन्न करते हैं , एक स्थान है।

एक दोहरे उद्धरण स्ट्रिंग के अंदर, एकल-उद्धरण से बचने की कोई आवश्यकता नहीं है।

उदाहरण

हमें एक स्क्रिप्ट फ़ाइल में ऊपर डालते हैं:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

अब, नमूना तर्क के साथ स्क्रिप्ट चलाएँ:

$ sh script.sh one two three four 5
'one two three four 5'

यह स्क्रिप्ट POSIX है। यह साथ काम करेगा bashलेकिन इसकी आवश्यकता नहीं है bash

एक भिन्नता: रिक्त स्थान के बजाय स्लैश के साथ समवर्ती

हम एक स्थान से दूसरे वर्ण में समायोजन करके बदल सकते हैं IFS:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

उदाहरण के लिए:

$ sh script.sh one two three four       
'one/two/three/four'

ठीक है, इसने बहुत अच्छा काम किया और ठीक वैसा ही किया जैसा मुझे चाहिए था। मैं इसका उपयोग केवल तर्कों का उपयोग करके निर्देशिका में निर्देशिका के साथ निर्देशिका में बदलने के लिए करने के लिए कर रहा हूं। आखिरकार इसके लिए मुझे एक फ़ंक्शन बनाने की आवश्यकता थी जो निर्देशिकाओं को अपोस्ट्रोफ़्स टाइप करने के बिना निर्देशिकाओं को बदल देगा यदि निर्देशिका में शब्द समाप्त हो गए हैं। मैंने अभी जो प्रयास किया वह निम्नलिखित था: cdm () {str = "'$ *'" cd $ str} यह केवल str में पहला तर्क देता है। उदाहरण के लिए: cdm test 2 परिणाम: 'परीक्षण: ऐसी कोई फ़ाइल या निर्देशिका
Schwmmister

@Schwagmister: यदि आप चाहते हैं कि आप इसे (स्ट्रिंग) चर में सहेज सकते हैं, लेकिन, अगर आपको विशेष रूप से ऐसा करने की आवश्यकता नहीं है, तो मुझे लगता है कि cd "$*"यह काफी अच्छा होगा।
स्कॉट

@Schwagmister सिंगल कोट्स वहां मददगार नहीं हैं। कोशिश करें: cdm(){ str="$*"; cd "$str"; }या, जैसा कि स्कॉट का सुझाव है cdm(){ cd "$*"; },। इसके अलावा, ध्यान रखें कि $*एक ही स्थान के साथ कई लगातार रिक्त स्थान बदलता है। यदि आपके निर्देशिका नाम में कई लगातार स्थान या टैब या नई लाइनें हो सकती हैं, तो उन वर्णों को वास्तव में कार्य करने से पहले बच निकलने की आवश्यकता होती है cdm
जॉन 1024

तो अगर यह परीक्षण 2 परीक्षण 1 की तरह कुछ है, तो मैं इस सीडी कमांड को सही तरीके से कैसे काम करूंगा? इसके अलावा यह आश्चर्यजनक मदद है कि मैं वास्तव में इसकी सराहना करता हूं। @Scott
Schwagmister

सबसे अच्छा तरीका है @Schwagmister कमांड लाइन पर एकल उद्धरण डाल करने के लिए जब बुला है cdmके रूप में: cdm 'test 2 trial 1'। यह अजीब नामों के सभी मनोर को संभाल लेगा। हालांकि, जब तक सफेद रिक्त स्थान एकल-रिक्त स्थान तक सीमित होते हैं, तब तक cdmइसे चलाया जा सकता है cdm test 2 trial 1
John1024

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.