বাশ ডায়নামিক (পরিবর্তনশীল) ভেরিয়েবলের নাম


12

আমি গতিরূপে একটি অ্যারের উপাদানগুলিকে ম্যানিপুলেট করে স্ট্রিংগুলির ক্রম তৈরি করতে এবং কিছু গাণিতিক পদ্ধতি তৈরি করতে চাই।

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "\n"
done

ইচ্ছা ফলাফল $6সমান জন্য নীচে হবে 0

1q;d
2q;d
3q;d
4q;d
5q;d

তবে আমি এই ত্রুটি পেয়েছি

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution

আমি অনুমান করি এটি সাধারণ কিছু। যখন আমি কিছু পছন্দ করি তখন এটি কাজ করত

FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"

1
আপনি কি আরও ভাল ব্যাখ্যা করতে পারেন। আপনি কী করার চেষ্টা করছেন তা সত্যিই বুঝতে পারছেন না।
নিউরন

To $ নাম = $ (($ 6 + 1)) to করণীয় কি?
PSkocik

@ স্পসোকিক আমি আশা করছিলামFIRST=$(( $6 + 1 ))
জিয়ানিস ক্রিসটোফাকিস

উত্তর:


16

সবার আগে =ভেরিয়েবল ঘোষণার আশেপাশে কোনও স্থান থাকতে পারে না bash

আপনি যা চান তা পেতে আপনি ব্যবহার করতে পারেন eval

উদাহরণস্বরূপ আপনার মতো একটি নমুনা স্ক্রিপ্ট:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

মুদ্রণ:

1q;d
2q;d
3q;d
4q;d
5q;d

evalসতর্কতার সাথে ব্যবহার করুন , কিছু লোক কিছু বৈধ কারণে এটিকে মন্দ বলে।

declare খুব কাজ করবে:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%s\n' "${!name}"
    i=$(( $i + 1 ))
done

এছাড়াও মুদ্রণ:

1q;d
2q;d
3q;d
4q;d
5q;d

!উদ্দীপনা চিহ্নটি কীসের printf '%s\n' "${!name}"জন্য?
জিয়ানিস ক্রিস্টোফাকিস

1
তার বলা পরোক্ষ সম্প্রসারণ bashপ্যারামিটার expansion..read এই
heemayl

1
বাশের কাছে declare/ eval: এর সর্বোত্তম বিকল্প রয়েছে printf -v varname '%fmt' args। কিছু ব্যাশ-সমাপ্তির অভ্যন্তরীণ ফাংশনগুলি কল-বাই-রেফারেন্সের জন্য এটি ব্যবহার করে। (স্টোর করার জন্য একটি ভেরিয়েবলের নাম পাস করুন)।
পিটার কর্ডস 11:25

দ্রষ্টব্য: ব্যবহারটি declareস্থানীয় স্কোপগুলিতে কেবল পরিবর্তনশীল সেট করে, যখন evalবিশ্বব্যাপী এটিকে সেট করে।
ব্যবহারকারীর

11

নামটি অন্য ভেরিয়েবলের মধ্যে রাখার সময় আপনি যদি কোনও ব্যাশ ভেরিয়েবলটি উল্লেখ করতে চান তবে আপনি নীচে এটি করতে পারেন:

$ var1=hello
$ var2=var1
$ echo ${!var2}
hello

আপনি এই ক্ষেত্রে যে ভেরিয়েবলটি অ্যাক্সেস করতে চান তার নাম সংরক্ষণ করুন say তারপরে আপনি এটিকে অ্যাক্সেস করতে পারেন ${!<varable name>}যেখানে <variable name>ভেরিয়েবলের সাথে আপনি যে ভেরিয়েবলটি অ্যাক্সেস করতে চান তার নাম ধারণ করে।


বহনযোগ্য উপায় আছে eval var=\$$holderতবে evalবিপজ্জনক!
গ্যাভেনকোয়া

1
index=0;                                                                                                                                                                                                           
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    name=$(($index + 1))
    echo "${name}q;d"
    index=$((index+1))
done

আপনি কি এটাই চেষ্টা করছেন?


1

আমি আপনার কোড এবং আপনার পছন্দসই আউটপুট থেকে যা পেয়েছি (আমি ভুল হলে আমাকে সংশোধন করি):
"FIRST" / "SECOND" / ... পরিবর্তনশীল নামের কোনও ব্যবহার নেই, আপনার কেবল একটি সূচক সহ একটি লুপ প্রয়োজন .. ।

এটি কাজটি করবে:

for i in {1..5} ; do echo $i"q;d" ; done


হ্যাঁ, আপনি ঠিক বলেছেন, অতিরিক্ত ছাড়া আমি একটি ভেরিয়েবলের সাথে একটি গাণিতিক কাজ করতে চাই।
জিয়ানিস ক্রিসোফাকিস

আপনি কি এই পাটিগণিত কার্যের একটি উদাহরণ দিতে পারেন? আপনার জন্য কি ভেরিয়েবলের নাম ("THIRD" এর মতো) দরকার আছে বা কেবল সূচকের মান?
csny

SUM=$(($6 + $i)); echo $SUM"q;d", আমি দেখছি আমি কী ভুল করছি।
জিয়ানিস ক্রিস্টোফাকিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.