2009-12-30 16 views
107

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

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

#!/bin/bash 

myFunction 
{ 
    echo $1 
    echo $2 
    echo $3 
} 

myFunction "firstString" "second string with spaces" "thirdString" 

जब चलाने के लिए, उत्पादन मैं उम्मीद थी है: वहाँ एक रास्ता

firstString 
second 
string 

है:

firstString 
second string with spaces 
thirdString 

हालांकि, क्या वास्तव में उत्पादन होता है रिक्त स्थान के साथ स्ट्रिंग को एक फंक्शन में एक फ़ंक्शन के लिए एक तर्क के रूप में पास करने के लिए?

+0

निर्माण चल अंतरिक्ष अलग बहस के लिए ... मैं हालांकि कार्यों के लिए पूर्ण सिंटैक्स का उपयोग करें") {echo $ 1; } ", एक लाइनर में छोटा नहीं बना सकता है। सुनिश्चित नहीं है कि इससे कोई फर्क पड़ता है। बैश का कौन सा संस्करण? – Eugene

+3

" $ @ "में $ @" '' "के लिए 'echo" $ e "' या' कोशिश करें; echo $ i; सही ढंग से उद्धृत पैरामीटर रिक्त स्थान युक्त प्रयोग करने के लिए done'। यह बहुत स्पष्ट रूप से 'स्थितीय parameters' धारा के तहत सभी' bash' दस्तावेज में बताया गया है। – Samveen

+1

मैं एक ऐसी ही समस्या हो रही थी, एक पैरामीटर के रूप एक उद्धृत स्ट्रिंग पारित करने के लिए और कोशिश कर केवल पहले पैरामीटर के हिस्से के रूप में पहचाने जाने वाले स्ट्रिंग का शब्द। $ 1 से $ $ को बदलने के लिए सैवेन के सुझाव ने मेरे लिए काम किया। ध्यान दें कि मैं केवल फ़ंक्शन में एक पैरामीटर पास कर रहा था, लेकिन अगर मैं अधिक कथन का उपयोग कर गुजर रहा होता तो आवश्यक कर दिया गया। –

उत्तर

116

आपको उद्धरण देना चाहिए और साथ ही, आपकी कार्य घोषणा गलत है।

myFunction() 
{ 
    echo "$1" 
    echo "$2" 
    echo "$3" 
} 

और दूसरों की तरह, यह मेरे लिए भी काम करता है। हमें बताएं कि आप किस शैल का उपयोग कर रहे हैं।

+1

यह भी मेरे लिए बहुत अच्छी तरह से काम करता है। हम myFu के अंदर एक और समारोह बुला रहे हैं nction तो उद्धरण के साथ तर्क पास। चीयर्स :) – minhas23

+1

क्या आप समझा सकते हैं कि किसी को उद्धरण की आवश्यकता क्यों है? मैंने दोनों के साथ और बिना कोशिश की, और यह मेरे लिए काम नहीं किया। मैं उबंटू 14.04, जीएनयू बैश, संस्करण 4.3.11 (1) -release (x86_64-pc-linux-gnu) का उपयोग कर रहा हूं। मेरे लिए * क्या * काम करता है $ @ (उद्धरण के साथ या बिना) का उपयोग कर रहा है। –

4

myFunction की आपकी परिभाषा गलत है। यह होना चाहिए:

myFunction() 
{ 
    # same as before 
} 

या:

function myFunction 
{ 
    # same as before 
} 

भी हो, यह ठीक लग रहा है और बैश 3.2.48 पर मेरे लिए ठीक काम करता है।

-2

एक ही तरह की समस्या थी और असल में समस्या फ़ंक्शन नहीं थी और न ही फ़ंक्शन कॉल थी, लेकिन मैंने फ़ंक्शन में तर्क के रूप में क्या पारित किया था।

फ़ंक्शन को स्क्रिप्ट के शरीर से कहा जाता है - 'मुख्य' - इसलिए मैंने कमांड लाइन से "st1 ab" "st2 cd" "st3 ef" पास किया और इसे MyFunction $ * का उपयोग करके फ़ंक्शन पर पास कर दिया।

$ * समस्या का कारण बनता है क्योंकि यह वर्णों के एक सेट में फैलता है जिसे एक डिलीमीटर के रूप में व्हाइटस्पेस का उपयोग करके फ़ंक्शन में कॉल में व्याख्या किया जाएगा।

समाधान 'मुख्य' से फ़ंक्शन की ओर स्पष्ट तर्क से फ़ंक्शन में कॉल को बदलने का था: कॉल तब मेरा फ़ंक्शन "$ 1" "$ 2" "$ 3" होगा जो तारों के अंदर व्हाइटस्पेस को संरक्षित रखेगा उद्धरण तर्कों को सीमित करेंगे ... इसलिए यदि पैरामीटर में रिक्त स्थान हो सकते हैं, तो इसे सभी कार्यों की कॉल में स्पष्ट रूप से संभाला जाना चाहिए।

इस समस्याओं का लंबे समय से खोजों के लिए कारण हो सकता है के रूप में, यह कभी नहीं बुद्धिमान * तर्क पारित करने के लिए $ उपयोग करने के लिए हो सकता है ...

आशा इस कोई मदद करता है, किसी दिन, कहीं ... जनवरी

+0

सही उत्तर '" $ @ "' है, सभी उद्धृत '" $ 1 "', '" $ 2 "', ... स्थितित्मक पैरामीटर और न ही '$ *'। – Samveen

0

आप अपने प्रारंभिक पाठ के मामले में इस समस्या का एक विस्तार हो सकता था एक स्ट्रिंग प्रकार चर में स्थापित किया गया था, उदाहरण के लिए:

function status(){  
    if [ $1 != "stopped" ]; then 
    artist="ABC"; 
    track="CDE"; 
    album="DEF"; 
    status_message="The current track is $track at $album by $artist"; 
    echo $status_message; 
    read_status $1 "$status_message"; 
    fi 
} 

function read_status(){ 
    if [ $1 != "playing" ]; then 
    echo $2 
    fi 
} 

इस मामले में अगर आप स्ट्रिंग के रूप में आगे status_message चर उत्तीर्ण नहीं होते हैं ("" से घिरा हुआ) यह होगा विभिन्न तर्कों के एक माउंट में विभाजित।

"$ चर": वर्तमान ट्रैक

$ चर एबीसी द्वारा डीईएफ़ पर सीडीई है:

+0

ओपी ने 'myFunction "पहले स्ट्रिंग" "स्ट्रिंग के साथ दूसरी स्ट्रिंग" "तीसरी स्ट्रिंग" का उपयोग किया और यह उसके लिए काम नहीं किया।तो आप जो प्रस्ताव देते हैं वह इस प्रश्न पर लागू नहीं होता है। – doubleDown

14

ऊपर मुद्दे पर एक अन्य समाधान एक चर, कॉल करने के लिए प्रत्येक स्ट्रिंग सेट करने के लिए है एक शाब्दिक डॉलर संकेत \$ द्वारा निर्दिष्ट वैरिएबल वाले फ़ंक्शन। फिर फ़ंक्शन में eval का उपयोग करके वैरिएबल और आउटपुट को पढ़ने के लिए उपयोग करें।

#!/usr/bin/ksh 

myFunction() 
{ 
    eval string1="$1" 
    eval string2="$2" 
    eval string3="$3" 

    echo "string1 = ${string1}" 
    echo "string2 = ${string2}" 
    echo "string3 = ${string3}" 
} 

var1="firstString" 
var2="second string with spaces" 
var3="thirdString" 

myFunction "\${var1}" "\${var2}" "\${var3}" 

exit 0 

आउटपुट तो है:

string1 = firstString 
    string2 = second string with spaces 
    string3 = thirdString 

यह करने के लिए इसी तरह की एक समस्या को हल करने की कोशिश कर में, मैं यूनिक्स के मुद्दे सोच मेरी चर अंतरिक्ष delimeted गया में चल रहा था। मैं एक रिपोर्ट बनाने के लिए उपयोग किए जाने वाले चर की एक श्रृंखला सेट करने के लिए awk का उपयोग करके एक फ़ंक्शन में एक पाइप सीमित स्ट्रिंग को पार करने का प्रयास कर रहा था। मैंने शुरुआत में ghostdog74 द्वारा पोस्ट किए गए समाधान की कोशिश की लेकिन इसे काम नहीं कर सका क्योंकि मेरे सभी पैरामीटर उद्धरणों में पारित नहीं किए जा रहे थे। प्रत्येक पैरामीटर के लिए डबल-कोट्स जोड़ने के बाद यह अपेक्षित कार्य करना शुरू कर दिया।

नीचे मेरी कोड के पहले राज्य और पूरी तरह से राज्य के बाद से कार्य कर रहा है।

से पहले - गैर कार्यकरण कोड

#!/usr/bin/ksh 

#******************************************************************************* 
# Setup Function To Extract Each Field For The Error Report 
#******************************************************************************* 
getField(){ 
    detailedString="$1" 
    fieldNumber=$2 

    # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
    # And Strips Leading And Trailing Spaces 
    echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//' 
} 

while read LINE 
do 
    var1="$LINE" 

    # Below Does Not Work Since There Are Not Quotes Around The 3 
    iputId=$(getField "${var1}" 3) 
done<${someFile} 

exit 0 

के बाद - कार्यकरण कोड

#!/usr/bin/ksh 

#******************************************************************************* 
# Setup Function To Extract Each Field For The Report 
#******************************************************************************* 
getField(){ 
    detailedString="$1" 
    fieldNumber=$2 

    # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
    # And Strips Leading And Trailing Spaces 
    echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//' 
} 

while read LINE 
do 
    var1="$LINE" 

    # Below Now Works As There Are Quotes Around The 3 
    iputId=$(getField "${var1}" "3") 
done<${someFile} 

exit 0 
0

सरल समाधान है कि मेरे लिए काम किया - $ @

Test(){ 
    set -x 
    grep "[email protected]" /etc/hosts 
    set +x 
} 
Test -i "3 rb" 
+ grep -i '3 rb' /etc/hosts 

मैं वास्तविक सत्यापित कर सकता उद्धृत grep कमांड (सेट -x के लिए धन्यवाद)।

0

इस समस्या का आसान समाधान है कि आप बस का उपयोग करने की जरूरत है \ है समारोह bla ("जब एक खोल स्क्रिप्ट मेरे लिए #!/bin/bash myFunction { echo $1 echo $2 echo $3 } myFunction "firstString" "\"Hello World\"" "thirdString"

संबंधित मुद्दे