একটি ভেরিয়েবল নামের সাথে ভেরিয়েবল সংজ্ঞা দিন


11

এই স্ক্রিপ্টটিতে কী সমস্যা? আমি এ 1 = 1, বি 1 = 1, সি 1 = 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
আমি মনে করি না আপনি এইভাবে বাশে ভেরিয়েবল তৈরি করতে পারেন। এই জন্য অ্যারে কি হয়।
জাকুজে 22'15

3
ব্যবহার eval "$x"1=1। যদিও, জাকুজে উল্লেখ করেছেন, অ্যারেগুলি সম্ভবত এই ক্ষেত্রে উপযুক্ত suited
অ্যান্ড্রিয়া করবেলিনি

@ আন্দ্রে কার্বেলিনী আপনার উত্তর হিসাবে এটি লেখা উচিত।
স্পারহাক

উত্তর:


21

একটি ভেরিয়েবল অ্যাসাইনমেন্টে একটি ভেরিয়েবল নামের ফর্ম থাকে, তার পরে সমান চিহ্ন এবং তার পরে (alচ্ছিক) মান হয়।

এটি একটি কার্যকর অ্যাসাইনমেন্ট:

ABC=123

"$x"1=1একটি বৈধ অ্যাসাইনমেন্ট নয়, কারণ "$x"1একটি পরিবর্তনশীল নাম নয়। এমনও হতে পারে Eval একটি পরিবর্তনশীল নামের uated, কিন্তু এটা নয়। শেলটি বাস্তবে বিশ্বাস করে যে এটি একটি কমান্ড।

আপনি যা অর্জন করতে চান তার করার একটি উপায় হ'ল:

eval "$x"1=1

ব্যাশের অন্য উপায় (তবে অন্যান্য শেলের মধ্যে নয়):

declare "$x"1=1

বা এছাড়াও (আবার কেবল বাশ কেবল):

let "$x"1=1

(আপনার ক্ষেত্রে খুব একটা পার্থক্য নেই।)

তবে, জাকুজে মন্তব্যে যেমন উল্লেখ করেছেন , আপনার শেলটি যদি (কেএস, বাশ বা জেডএস) থাকে তবে আপনি সম্ভবত অ্যারে নিয়ে যেতে চান।


সম্পূর্ণতার জন্য:

  • evalনির্বিচার কমান্ড কার্যকর করে। সুতরাং, যদি সমান চিহ্নের ডানদিকে আপনার একটি ভেরিয়েবল থাকে যা কিছু কমান্ডে প্রসারিত হয় তবে সেই কমান্ডটি কার্যকর হবে। নিম্নলিখিত কোড:

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

    সমতূল্য a=hello

  • declareভেরিয়েবল বরাদ্দ করতে বাশ অন্তর্নির্মিত এবং কোনও কমান্ড কার্যকর করে না। নিম্নলিখিত কোড:

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

    সমতূল্য a='$(echo hello)'

  • letdeclareএটি কমান্ড কার্যকর করে না যে অনুরূপ । কিন্তু বিপরীত 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উদ্ধৃতি এড়িয়ে চলাকালীন এগুলি করার জন্য আরও বিকল্পগুলির জন্য FAQ এন্ট্রি দেখুন ।


0

আপনি নিম্নলিখিত মত কোড ব্যবহার করতে পারেন। আপনার কোডে শেল "$x"1=1একটি কমান্ড হিসাবে কার্যকর করে কারণ এটি বৈধ পরিবর্তনশীল অ্যাসাইনমেন্ট নয়।

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

আপনি কোন শেল ব্যবহার করছেন? বোশ বাশ ৪.১..7 এবং ৪.৩.১১ ব্যবহার করে command not found <varname>=1যখন আমি এটি করার চেষ্টা করি তখন আমি ত্রুটিগুলি পেয়েছি (স্পষ্টত <ভার্নাম> আমি যে মান সঞ্চিত রেখেছি a)
এরিক রেনোফ

@ অ্যান্ড্রিয়া কার্বেলিনী দ্বারা ব্যাখ্যা করা হয়েছে, মান নির্ধারণের জন্য আমাদের লেট, ডিক্লেয়ার বা অ্যাভাল ব্যবহার করতে হবে ..
এভিজে

1
তোমার echoএখানে দরকার নেই! শুধু a="$x"1। এছাড়াও letএকটি গাণিতিক প্রসঙ্গ, তাই আপনি এটি দিয়ে শুধুমাত্র বরাদ্দ সংখ্যার পারেন হয়।
পিটার কর্ডেস

declare $a=foobarকাজ করে।
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.