एक चर नाम के साथ चर को परिभाषित करें


11

इस स्क्रिप्ट में क्या गलत है? मैं A1 = 1, B1 = 1, C1 = 1 को परिभाषित करने का प्रयास कर रहा हूं

LIST="A B C"
for x in $LIST
do
    "$x"1=1
done

और परिणाम है:

./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found

1
मुझे नहीं लगता कि आप इस तरह से बैश में वैरिएबल बना सकते हैं। यह वही है जिसके लिए सरणियाँ हैं।
12

3
का उपयोग करें eval "$x"1=1। हालांकि, जैसा कि जकूज़ी ने कहा, इस मामले के लिए एरे शायद बेहतर अनुकूल हैं।
एंड्रिया कोरबेलिनी

@AndreaCorbellini आपको एक उत्तर के रूप में लिखना चाहिए।
स्पार्कहॉक

जवाबों:


21

एक चर असाइनमेंट में एक चर नाम होता है, जिसके बाद समान चिह्न होता है, उसके बाद (वैकल्पिक) मान होता है।

यह एक मान्य असाइनमेंट है:

ABC=123

"$x"1=1एक मान्य असाइनमेंट नहीं है, क्योंकि "$x"1एक चर नाम नहीं है। यह हो सकता है eval एक चर नाम के uated, लेकिन यह नहीं है। वास्तव में, शेल का मानना ​​है कि यह एक आदेश है।

आप जो हासिल करना चाहते हैं, उसे करने का एक तरीका यह है:

eval "$x"1=1

बैश में एक और तरीका (लेकिन अन्य गोले में नहीं) है:

declare "$x"1=1

या फिर (केवल बैश-केवल):

let "$x"1=1

(आपके मामले में बहुत अंतर नहीं है।)

लेकिन, जैसा कि जकुजे ने टिप्पणी में उल्लेख किया है , आप संभवतः सरणियों के साथ जाना चाहते हैं, यदि आपके शेल में उन्हें (ksh, bash या zsh) है।


संपूर्णता के लिए:

  • evalमनमाना आदेशों को क्रियान्वित करता है। इसलिए, यदि समान चिह्न के दाईं ओर आपके पास एक चर है जो कुछ कमांड तक फैलता है, तो उस कमांड को निष्पादित किया जाएगा। निम्नलिखित कोड:

    x=a
    y='$(echo hello)'
    eval "$x=$y"

    के बराबर है a=hello

  • declareवैरिएबल असाइन करने के लिए एक बैश बिलिन है और किसी भी कमांड को निष्पादित नहीं करेगा। निम्नलिखित कोड:

    x=a
    y='$(echo hello)'
    declare "$x=$y"

    के बराबर है a='$(echo hello)'

  • letके समान है declare, इसमें वह कमांड निष्पादित नहीं करता है। लेकिन इसके विपरीत declare, letअंकगणितीय संचालन के लिए इस्तेमाल किया जा सकता है:

    let a="1 + 2"

    के बराबर है a=3


यहां तक ABC = 123कि अमान्य है। क्योंकि equal(=)साइन से पहले और बाद में स्पेस जोड़ा जाता है ।
महेंद्रन सकरई

3

बैश एफएक्यू में अप्रत्यक्ष रूप से प्रवेश होता है। अधिकांश उपयोग-मामलों में, आपको वास्तव में क्या करना चाहिए एक साहचर्य या अनुक्रमित सरणी का उपयोग करना है। आप भी उपयोग कर सकते हैं

func_call_by_reference() { # Bash 4.3
    typeset -n ref=$1   # nameref to the variable named by the caller
    ref=( "val1" "val2" ... )  # return an array by reference
}

यह देखते हुए कि ऐसा करने के लिए अधिक विकल्पों के लिए अक्सर पूछे जाने वाले प्रश्न प्रविष्टि, जबकि अभी भी गंदे evalउद्धरण से बचते हैं ।


0

आप निम्नलिखित की तरह कोड का उपयोग कर सकते हैं। आपके कोड शेल "$x"1=1में कमांड के रूप में निष्पादित होता है क्योंकि यह एक वैध चर असाइनमेंट नहीं है।

LIST="A B C"
for x in $LIST
do
    a=$(echo "$x"1)
    let $a=1
done

आप किस खोल का उपयोग कर रहे हैं? बश बैश का उपयोग 4.1.7 और 4.3.11 command not found <varname>=1जब मैं करने की कोशिश करता हूं, तो मुझे गलतियां मिलती हैं (जाहिर है <varname> मेरे द्वारा संग्रहित मूल्य में a)
एरिक

जैसा कि @Andrea Corbellini द्वारा समझाया गया है, हमें मान असाइन करने के लिए let, घोषण या eval का उपयोग करना होगा ..
AVJ

1
आपको echoयहाँ ज़रूरत नहीं है! बस a="$x"1। इसके अलावा letएक अंकगणितीय प्रसंग है, इसलिए आप केवल इसके साथ संख्याएँ निर्दिष्ट कर सकते हैं।
पीटर कॉर्ड्स

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