2013-04-21 12 views
5

मेरे पास एक स्क्रिप्ट है जहां उपयोगकर्ता इनपुट को कई बार मूल्यांकन करने की आवश्यकता है, समाधान पर काम कर रहा है समाधान मूल्यांकन बिट्स को फ़ंक्शन में रखना है, और हर बार जब मुझे आवश्यकता होती है तो फ़ंक्शन को कॉल करें इनपुट का मूल्यांकन करें। समस्या यह है कि जब मैं $1 चर (जो फ़ंक्शन के पहले चर पैरामीटर को संदर्भित करता है) को अद्यतन करने का प्रयास कर रहा हूं, तो मुझे त्रुटि संदेश "$ VARIABLE आदेश नहीं मिला" मिलता है।फ़ंक्शन के अंदर बैश अप्रत्यक्ष परिवर्तनीय असाइनमेंट

function input_handler() { 
if is_integer $1; then 
    selid="$1 -1" 
    if [[ "$1" -le "0" ]]; then 
    echo "Please use a simple positive number!" 
    else 
    if [[ "$1" -le "${#array[*]}" ]]; then 
    eval $1="${array[selid]}" 
    echo "Ok, moving on..." 
    else 
    echo "That number seems too large, try again?" 
    fi 
    fi 
else 
    if [ -e $2/$1 ]; then 
    echo "Ok, moving on..." 
    else 
    echo "That item is not on the list, try again!" 
    fi 
fi 
} 

और इस आदेश:: अब

5 
./test: line 38: 5=sun: command not found 

ठीक है, पर चलती ...

:

input_handler $doctype $docpath 

इस उत्पादन देता है

यहाँ कोड है यह लगभग सही है, लेकिन मैं क्या कर रहा हूँ आर doctype = सूरज है, नहीं 5 = सूरज, दूसरे शब्दों में मुझे $1 परिवर्तनीय नाम की आवश्यकता नहीं है। लाइन eval $1="${array[selid]}" से eval doctype="${array[selid]}" को बदलकर इस विशेष उदाहरण को ठीक किया गया है। लेकिन यह मेरी समस्या को ठीक नहीं करता है क्योंकि मुझे अलग-अलग नामों के साथ विभिन्न चरों पर इस फ़ंक्शन को चलाने की आवश्यकता है।

उत्तर

-1

स्थितित्मक पैरामीटर केवल पढ़ने के लिए हैं। तो आप क्या करना चाहते हैं संभव नहीं है। आप की तरह

foo=$1 

कुछ करना चाहिए और उसके बाद के साथ $foo$1 के बजाय

+0

ठीक है, लेकिन मुझे अभी भी $ 1 के नाम की आवश्यकता नहीं है, क्या यह संभव है? –

+1

पोजिशनल पैरामीटर केवल पढ़ने के लिए नहीं हैं। आप उन्हें 'सेट' के साथ बदल सकते हैं। – kojiro

0

आप एक पारंपरिक काम के साथ $1 का मान अपडेट नहीं कर सकते हैं काम करते हैं, लेकिन आप set builtin साथ स्थितीय मापदंडों अद्यतन कर सकते हैं।

$ f() { echo "[email protected]"; set -- a b c; echo "[email protected]"; echo $2; } 
$ f 1 2 3 
1 2 3 
a b c 
b 

बस, यह ध्यान रखें कि यह सब स्थितीय मापदंडों आप हर बार नहीं फिर से स्थापित कर सकता का सफाया करेंगे, ताकि आप $2 स्थापित करने के लिए आप इसे चारों ओर रखना चाहते हैं की आवश्यकता होगी।

आपकी सर्वश्रेष्ठ शर्त शायद नामों के लिए स्थितित्मक पैरामीटर में मान असाइन करने और उसके बाद से नामों का उपयोग करने के लिए है।

4

हो सकता है कि पूरी तरह से समझ में नहीं आता कि आप क्या हासिल करना चाहते हैं, लेकिन अगले उदाहरण की जाँच करें:

weirdfunc() { 
    echo " weirdfunc: variable name is: $1" 
    echo " weirdfunc: variable value is: ${!1}" 
    eval "$1=$((${!1} + 1))" #assign 
} 

myvar="5" 
echo "the value of myvar before: $myvar" 

weirdfunc myvar #call with the NAME not with the value, so NOT weridfunc $myvar 

echo "the value of myvar after: $myvar" 

संक्षेप में - जब आप एक बुलाया समारोह में चर नाम साथ कुछ भी करना चाहते हैं, तो आप पास करना चाहिए चर का नाम और उसका मूल्य नहीं। तो समारोह

somefunc NAME 

somefunc $NAME 

के बजाय

फोन और ऊपर निर्माणों का उपयोग नाम और समारोह के अंदर मूल्य मिलता है।

+0

शायद मुझे यह स्पष्ट करना चाहिए कि मुझे क्या करना है। स्क्रिप्ट जो मैं फाइल प्रविष्टियों की एक सूची में पाइप पर काम कर रहा हूं और उपयोगकर्ता को wich फ़ाइल के लिए संकेत देता हूं, अगर इसे एक वैध choise को परिवर्तनीय $ 1 चर में संग्रहीत किया जाना चाहिए। अब तक सबकुछ अच्छी तरह से काम करता है, लेकिन यहां मुश्किल हिस्सा है; स्क्रिप्ट को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए मैंने प्रत्येक फ़ाइल प्रविष्टि के सामने संख्याएं जोड़ दी हैं। विचार यह है कि उपयोगकर्ता पूर्ण फ़ाइल नाम के अंत में एक संबंधित संख्या टाइप कर सकते हैं। लेकिन इसके लिए काम करने के लिए मुझे अपने choise "जैसे 5" को एक वैध फ़ाइल नाम "सूर्य की तरह" में बदलने के लिए फ़ंक्शन की आवश्यकता है और स्टोर करें कि $ 1 परिवर्तनीय –

+0

में यदि आप एक वेरिएबल पास __by name__ के मान को बदलना चाहते हैं तो उपर्युक्त संरचनाओं का उपयोग करें। यदि आप $ 1 का उपयोग @ कोोजिरो के उत्तर को सेट करना चाहते हैं, लेकिन ईमानदारी से यह समझना नहीं है कि ऐसा क्यों करना चाहते हैं, जब आप किसी भी सहायक चर का उपयोग कर सकते हैं ... सबसे अच्छा आप कर सकते हैं - एक वास्तविक लघु उदाहरण दिखाएं - बिना किसी असंबंधित "अगर "और मुख्य भाग के साथ भी - न केवल कार्य ही ... – jm666

+0

आप बिल्कुल सही हैं! मैंने इसे eval $1="${array[selid]}" के बजाय एक सहायक चर helper="${array[selid]}" जोड़कर हल किया, और इसे फ़ंक्शन के बाहर बुलाया: input_handler $doctype $docpath
doctype=$helper
क्षमा करें अगर स्पष्ट नहीं था, तो सामान्य रूप से स्टैक ओवरफ्लो और बैश स्क्रिप्टिंग के लिए नया है। आपकी सभी मदद का धन्यवाद! –

0

यदि आप चर नाम की रक्षा करते हैं, तो बैश मूल्यांकन करेगा और $ 1 = मूल्य निष्पादित करने के बजाय $ 1 को असाइन करेगा।

eval "$1"=${array[selid]} 
संबंधित मुद्दे