বাশের গতিশীল পরিবর্তনশীল নাম


159

আমি বাশ স্ক্রিপ্ট সম্পর্কে বিভ্রান্ত।

আমার কাছে নিম্নলিখিত কোড রয়েছে:

function grep_search() {
    magic_way_to_define_magic_variable_$1=`ls | tail -1`
    echo $magic_variable_$1
}

আমি কমান্ডের প্রথম যুক্তি যুক্ত এবং একটি ভেরিয়েবলের নাম তৈরি করতে সক্ষম হতে চাই, যেমন শেষ পংক্তির মান ls

তাই আমি যা চাই তা বর্ণনা করার জন্য:

$ ls | tail -1
stack-overflow.txt

$ grep_search() open_box
stack-overflow.txt

সুতরাং, আমি কীভাবে সংজ্ঞায়িত / ঘোষণা করব $magic_way_to_define_magic_variable_$1এবং কীভাবে এটি স্ক্রিপ্টের মধ্যে কল করব?

আমি চেষ্টা করেছি eval, ${...}, \$${...}, কিন্তু আমি এখনও বিভ্রান্ত করছি।


3
না। ডেটাতে কমান্ডের নামটি ম্যাপ করতে একটি সহযোগী অ্যারে ব্যবহার করুন।
চিপনার

3
VAR = a; Val = 333; "$ VAR" <<< "$ ভ্যাল" পড়ুন; প্রতিধ্বনি "এ = $ এ"
গ্রিগরি কে

উত্তর:


150

কী হিসাবে কমান্ডের নাম সহ একটি সহযোগী অ্যারে ব্যবহার করুন।

# Requires bash 4, though
declare -A magic_variable=()

function grep_search() {
    magic_variable[$1]=$( ls | tail -1 )
    echo ${magic_variable[$1]}
}

যদি আপনি সহযোগী অ্যারে ব্যবহার করতে না পারেন (যেমন, আপনাকে অবশ্যই সমর্থন করতে হবে bash3), আপনি declareগতিশীল পরিবর্তনশীল নামগুলি তৈরি করতে ব্যবহার করতে পারেন :

declare "magic_variable_$1=$(ls | tail -1)"

এবং মান অ্যাক্সেস করতে পরোক্ষ প্যারামিটার সম্প্রসারণ ব্যবহার করুন।

var="magic_variable_$1"
echo "${!var}"

বাশফএকিউ দেখুন: নির্দেশনা - পরোক্ষ / রেফারেন্স ভেরিয়েবলের মূল্যায়ন


5
@ ডিডইএনডি -aএকটি সূচকযুক্ত অ্যারে ঘোষণা করে, কোনও এসোসিয়েটিভ অ্যারে নয়। তর্কের grep_searchসংখ্যাটি না হলে এটি একটি সংখ্যাসূচক মান হিসাবে প্যারামিটার হিসাবে বিবেচিত হবে (যা প্যারামিটারটি সেট না করা থাকলে 0 এ ডিফল্ট হয়)।
চিপনার

1
হুম। আমি ব্যাশ ব্যবহার করছি 4.2.45(2)এবং ঘোষণা করছি এটি বিকল্প হিসাবে তালিকাভুক্ত নয় declare: usage: declare [-afFirtx] [-p] [name[=value] ...]। মনে হচ্ছে এটি সঠিকভাবে কাজ করছে।
fent

declare -h4.2.45 (2) এ আমার শো দেখায় declare: usage: declare [-aAfFgilrtux] [-p] [name[=value] ...]। আপনি ডাবল-চেক করতে পারেন যে আপনি আসলে 4.x চলছে এবং 3.2 নয়।
চিপনার

5
শুধু কেন নয় declare $varname="foo"?
বেন ডেভিস

1
${!varname}অনেক সহজ এবং ব্যাপকভাবে সামঞ্জস্যপূর্ণ
ব্র্যাড হেইন

227

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

suffix=bzz
declare prefix_$suffix=mystr

...এবং তারপর...

varname=prefix_$suffix
echo ${!varname}

যদি কোনও ফাংশনের অভ্যন্তরে গ্লোবাল ঘোষণা করতে চান, তবে bash> = 4.2 এ "ঘোষণা -g" ব্যবহার করতে পারেন। আগের ব্যাশে, "ঘোষিত" এর পরিবর্তে "পঠনযোগ্য" ব্যবহার করতে পারেন, যতক্ষণ আপনি পরে মানটি পরিবর্তন করতে চান না। কনফিগারেশনের জন্য বা আপনার কাছে যা ঠিক আছে তা ঠিক আছে।
স্যাম ওয়াটকিন্স

7
এনক্যাপসুলেটেড ভেরিয়েবল ফর্ম্যাটটি ব্যবহার করা সবচেয়ে ভাল: prefix_${middle}_postfix(যেমন আপনার ফর্ম্যাটটি কাজ করে না varname=$prefix_suffix)
msciwoj

1
আমি বাশ 3 এর সাথে আটকে ছিলাম এবং সহযোগী অ্যারেগুলি ব্যবহার করতে পারি না; এই যেমন একটি জীবন রক্ষাকারী ছিল। $ {! ... g গুগল করা সহজ নয়। আমি ধরে নিলাম এটি কেবল একটি বর্ণের নাম প্রসারিত করে।
নিল ম্যাকগিল

10
@ নীলম্যাকগিল: "ম্যান বাশ" দেখুন gnu.org/software/bash/manual/html_node/… : প্যারামিটার সম্প্রসারণের প্রাথমিক রূপটি {{প্যারামিটার}} <...> প্যারামিটারের প্রথম অক্ষরটি যদি একটি বিস্মৃত বিন্দু (!) হয় তবে ভ্যারিয়েবল ইন্ডিরেশনের একটি স্তর চালু করা হয়। বাশ অন্যান্য প্যারামিটার থেকে গঠিত ভেরিয়েবলের মানটি ভেরিয়েবলের নাম হিসাবে ব্যবহার করে; এই পরিবর্তনশীলটি তখন প্রসারিত হয় এবং সেই মানটি প্যারামিটারের মানের পরিবর্তে বাকী বিকল্পে ব্যবহৃত হয়।
ইওরিক.সর

1
@ সাইন্ট্যাক্সেরর: উপরের "ডিক্লেয়ার" কমান্ডের সাহায্যে আপনি যতটা মান নির্ধারণ করতে পারেন।
ইয়োরিক.সর

48

সহযোগী অ্যারেগুলি ছাড়িয়ে, বাশে গতিশীল পরিবর্তনশীলগুলি অর্জনের বিভিন্ন উপায় রয়েছে। নোট করুন যে এই সমস্ত কৌশলগুলি ঝুঁকিগুলি উপস্থিত করে, যা এই উত্তরটির শেষে আলোচনা করা হয়েছে।

নিম্নলিখিত উদাহরণগুলিতে আমি ধরে নেব i=37এবং আপনি যে ভেরিয়েবলটির var_37প্রাথমিক মান তার নামটি দিতে চান lolilol

পদ্ধতি 1. একটি "পয়েন্টার" ভেরিয়েবল ব্যবহার করে

আপনি কেবল পরিবর্তিত পরিবর্তে ভেরিয়েবলের নাম সংরক্ষণ করতে পারেন, সি পয়েন্টারের বিপরীতে নয়। তারপরে বাশের আলিয়াস্ত ভেরিয়েবলটি পড়ার জন্য একটি বাক্য গঠন রয়েছে : ভেরিয়েবলের মানটিতে ${!name}প্রসারিত হয় যার নাম ভেরিয়েবলের মান name। আপনি এটিকে দ্বি-পর্যায়ে সম্প্রসারণ হিসাবে ভাবতে পারেন: ${!name}প্রসারিত হয় $var_37, যা প্রসারিত হয় lolilol

name="var_$i"
echo "$name"         # outputs “var_37”
echo "${!name}"      # outputs “lolilol”
echo "${!name%lol}"  # outputs “loli”
# etc.

দুর্ভাগ্যক্রমে, এলিয়াসেড ভেরিয়েবলটি সংশোধন করার জন্য কোনও পাল্টা সিনট্যাক্স নেই । পরিবর্তে, আপনি নিম্নলিখিত কৌশলগুলির একটির সাথে অ্যাসাইনমেন্ট অর্জন করতে পারেন।

1A। দিয়ে বরাদ্দ করা হচ্ছেeval

evalমন্দ, তবে আমাদের লক্ষ্য অর্জনের সবচেয়ে সহজ এবং বহনযোগ্য উপায়। অ্যাসাইনমেন্টের ডান দিকের দিক থেকে আপনাকে সাবধানে পালাতে হবে, কারণ এটি দুবার মূল্যায়ন করা হবে । এটি করার একটি সহজ এবং নিয়মতান্ত্রিক উপায় হ'ল ডান হাতের আগে মূল্যায়ন (বা ব্যবহার করা printf %q)।

এবং আপনাকে ম্যানুয়ালি পরীক্ষা করে দেখতে হবে যে বাম দিকের দিকটি একটি বৈধ পরিবর্তনশীল নাম, বা সূচী সহ একটি নাম (এটি যদি তবে কী হত evil_code #?)। বিপরীতে, নীচের অন্যান্য সমস্ত পদ্ধতি এটি স্বয়ংক্রিয়ভাবে প্রয়োগ করে।

# check that name is a valid variable name:
# note: this code does not support variable_name[index]
shopt -s globasciiranges
[[ "$name" == [a-zA-Z_]*([a-zA-Z_0-9]) ]] || exit

value='babibab'
eval "$name"='$value'  # carefully escape the right-hand side!
echo "$var_37"  # outputs “babibab”

downsides:

  • পরিবর্তনশীল নামের বৈধতা পরীক্ষা করে না।
  • eval মন্দ।
  • eval মন্দ।
  • eval মন্দ।

1B। দিয়ে বরাদ্দ করা হচ্ছেread

readBuiltin আপনি যদি একটি পরিবর্তনশীল, যার খবর আপনি নাম, একটা সত্য যা এখানে-স্ট্রিং সাথে শোষণ দিতে মান নির্ধারণ করতে দেয়:

IFS= read -r -d '' "$name" <<< 'babibab'
echo "$var_37"  # outputs “babibab\n”

IFSঅংশ এবং বিকল্প -rনিশ্চিত করুন যে মান হিসাবে হল নির্ধারিত হয়, যখন বিকল্প করতে -d ''বহু-লাইন মান নির্ধারণ করতে পারবেন। এই শেষ বিকল্পটির কারণে, কমান্ডটি একটি শূন্য-বহির্গমন কোড সহ ফিরে আসে।

মনে রাখবেন, যেহেতু আমরা এখানে স্ট্রিং ব্যবহার করছি, একটি নতুন লাইন অক্ষরটি মানটিতে যুক্ত হবে।

downsides:

  • কিছুটা অস্পষ্ট;
  • একটি শূন্য-বহির্গমন কোডের সাথে ফিরে আসে;
  • মানটিতে একটি নতুন লাইন সংযোজন করে।

1c। দিয়ে বরাদ্দ করা হচ্ছেprintf

বাশ ৩.১ (প্রকাশিত ২০০)) থেকে, printfবিল্টিন তার ফলাফলটি এমন একটি ভেরিয়েবলের কাছেও অর্পণ করতে পারে যার নাম দেওয়া হয়েছে। পূর্ববর্তী সমাধানগুলির সাথে বিপরীতে, এটি কেবল কাজ করে, জিনিসগুলি থেকে বাঁচতে, বিভাজন রোধ করতে এবং এ জাতীয় আরও কিছু করার দরকার পড়ে না।

printf -v "$name" '%s' 'babibab'
echo "$var_37"  # outputs “babibab”

downsides:

  • কম বহনযোগ্য (তবে, ভাল)।

পদ্ধতি 2. একটি "রেফারেন্স" ভেরিয়েবল ব্যবহার করে

বাশ ৪.৩ (প্রকাশিত ২০১৪) থেকে, declareবিল্টিনে -nএকটি ভেরিয়েবল তৈরির জন্য একটি বিকল্প রয়েছে যা অন্য একটি চলকটির কাছে "নাম উল্লেখ", অনেকটা সি ++ রেফারেন্সের মতো। মেথড 1-তে যেমন রেফারেন্সটি এলিয়াসেড ভেরিয়েবলের নাম সংরক্ষণ করে তবে প্রতিবার রেফারেন্স অ্যাক্সেস করা হয় (হয় পড়ার জন্য বা বরাদ্দ দেওয়ার জন্য), বাশ স্বয়ংক্রিয়ভাবে ইন্ডিয়ারেশনটি সমাধান করে।

উপরন্তু, ব্যাশ নিজের দ্বারা রেফারেন্স নিজেই, বিচারক মান পাবার জন্য একটি বিশেষ ও খুব বিভ্রান্তিকর শব্দবিন্যাস রয়েছে: ${!ref}

declare -n ref="var_$i"
echo "${!ref}"  # outputs “var_37”
echo "$ref"     # outputs “lolilol”
ref='babibab'
echo "$var_37"  # outputs “babibab”

এটি নীচে বর্ণিত সমস্যাগুলি এড়ায় না, তবে কমপক্ষে এটি সিনট্যাক্সটিকে সোজা করে তোলে।

downsides:

  • বহনযোগ্য নয়।

ঝুঁকি

এই সমস্ত aliasing কৌশল বিভিন্ন ঝুঁকি উপস্থাপন। প্রতিবার আপনি ইন্ডিরিশনটি সমাধান করার সময় প্রথমটি স্বেচ্ছাসেবক কোড কার্যকর করছে (হয় পড়ার জন্য বা কার্যধারার জন্য) । প্রকৃতপক্ষে, স্কেলার ভেরিয়েবলের পরিবর্তে, পছন্দ মতো var_37আপনি একটি অ্যারে সাবস্ক্রিপ্টও পছন্দ করতে পারেন arr[42]। তবে বাশ প্রতিটি বারের মতো বর্গাকার বন্ধনীগুলির বিষয়বস্তুগুলির যাবতীয় মূল্যায়ন করার জন্য এটি মূল্যায়ন করে, তাই এলিয়াসিংয়ের arr[$(do_evil)]উপর অপ্রত্যাশিত প্রভাব পড়তে পারে ... ফলস্বরূপ, আপনি যখন উলামের বংশবৃদ্ধি নিয়ন্ত্রণ করবেন তখন কেবল এই কৌশলগুলি ব্যবহার করুন

function guillemots() {
  declare -n var="$1"
  var="«${var}»"
}

arr=( aaa bbb ccc )
guillemots 'arr[1]'  # modifies the second cell of the array, as expected
guillemots 'arr[$(date>>date.out)1]'  # writes twice into date.out
            # (once when expanding var, once when assigning to it)

দ্বিতীয় ঝুঁকিটি একটি চক্রীয় ওরফে তৈরি করছে। যেহেতু বাশ ভেরিয়েবলগুলি তাদের নামে নয় এবং তাদের স্কোপ দ্বারা চিহ্নিত করা হয়েছে, আপনি অজান্তেই নিজের কাছে একটি এলিফ তৈরি করতে পারেন (যখন এটি ভেবেছিলেন যে এটি একটি ঘেরের ক্ষেত্র থেকে একটি ভেরিয়েবল হবে)। সাধারণ ভেরিয়েবল নামগুলি ব্যবহার করার সময় এটি বিশেষত ঘটতে পারে (যেমন var)। ফলস্বরূপ, আপনি যখন এলিয়াসেড ভেরিয়েবলের নামটি নিয়ন্ত্রণ করেন কেবল তখনই এই কৌশলগুলি ব্যবহার করুন

function guillemots() {
  # var is intended to be local to the function,
  # aliasing a variable which comes from outside
  declare -n var="$1"
  var="«${var}»"
}

var='lolilol'
guillemots var  # Bash warnings: “var: circular name reference”
echo "$var"     # outputs anything!

উৎস:


1
এটি সর্বোত্তম উত্তর, বিশেষত যেহেতু ${!varname}কৌশলটির জন্য একটি মধ্যবর্তী ভার প্রয়োজন varname
রিচভেল

এই উত্তরটি উচ্চতর উত্সাহিত করা হয়নি তা বুঝতে অসুবিধা
মার্কোস

18

নীচে $ name_of_var এর মান প্রদান করে

var=name_of_var
echo $(eval echo "\$$var")

4
echoকমান্ড সাবস্টিটিউশন (যা উদ্ধৃতিগুলি মিস করে) দিয়ে দু'য়ের বাসা বাঁধাই অপ্রয়োজনীয়। এছাড়াও, বিকল্প -nদেওয়া উচিত echo। এবং, সর্বদা হিসাবে, evalঅনিরাপদ। কিন্তু এই সব অপ্রয়োজনীয় যেহেতু ব্যাশ এই খুব উদ্দেশ্যে একটি নিরাপদ, পরিষ্কার এবং খাটো সিনট্যাক্স রয়েছে: ${!var}
মাওলান

4

এই কাজ করা উচিত:

function grep_search() {
    declare magic_variable_$1="$(ls | tail -1)"
    echo "$(tmpvar=magic_variable_$1 && echo ${!tmpvar})"
}
grep_search var  # calling grep_search with argument "var"

4

এটিও কাজ করবে

my_country_code="green"
x="country"

eval z='$'my_"$x"_code
echo $z                 ## o/p: green

তোমার ক্ষেত্রে

eval final_val='$'magic_way_to_define_magic_variable_"$1"
echo $final_val


3

ব্যবহার declare

অন্যান্য উত্তরের মতো উপসর্গগুলি ব্যবহার করার দরকার নেই, না অ্যারেও। ন্যায়বিচার declare, ডাবল উক্তি এবং পরামিতি প্রসারণ ব্যবহার করুন

আমি প্রায়ই contanining পার্স যুক্তি তালিকাতে নিম্নলিখিত কৌতুক ব্যবহার one to nহিসাবে ফর্ম্যাট আর্গুমেন্ট key=value otherkey=othervalue etc=etc, ভালো লেগেছে:

# brace expansion just to exemplify
for variable in {one=foo,two=bar,ninja=tip}
do
  declare "${variable%=*}=${variable#*=}"
done
echo $one $two $ninja 
# foo bar tip

তবে আরগভি তালিকার মতো সম্প্রসারণ করা

for v in "$@"; do declare "${v%=*}=${v#*=}"; done

অতিরিক্ত টিপস

# parse argv's leading key=value parameters
for v in "$@"; do
  case "$v" in ?*=?*) declare "${v%=*}=${v#*=}";; *) break;; esac
done
# consume argv's leading key=value parameters
while (( $# )); do
  case "$v" in ?*=?*) declare "${v%=*}=${v#*=}";; *) break;; esac
  shift
done

1
এটি দেখতে খুব পরিষ্কার সমাধান বলে মনে হচ্ছে। কোন মন্দ bibs এবং bobs এবং আপনি টুলস যা ভেরিয়েবল সাথে সম্পর্কিত হয় ব্যবহার করেন, যেমন আপাতদৃষ্টিতে সম্পর্কহীন বা এমনকি বিপজ্জনক ফাংশন অস্পষ্ট না printfবাeval
kvantour

2

বাহ, সিনট্যাক্সের বেশিরভাগই ভয়াবহ! আপনাকে যদি অপ্রত্যক্ষভাবে রেফারেন্স অ্যারেগুলি প্রয়োজন হয় তবে কিছু সরল বাক্য গঠন সহ এখানে একটি সমাধান রয়েছে:

#!/bin/bash

foo_1=("fff" "ddd") ;
foo_2=("ggg" "ccc") ;

for i in 1 2 ;
do
    eval mine=( \${foo_$i[@]} ) ;
    echo ${mine[@]} ;
done ;

সহজ ব্যবহারের ক্ষেত্রে আমি অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইডে বর্ণিত সিনট্যাক্সের প্রস্তাব দিই ।


2
এবিএস হ'ল তার উদাহরণগুলির মধ্যে খারাপ অভ্যাসগুলি প্রদর্শন করার জন্য কুখ্যাত। পরিবর্তে বাশ-হ্যাকার উইকি বা উওলজি উইকিতে ঝুঁকির বিষয়টি বিবেচনা করুন - যার পরিবর্তে সরাসরি অন-টপিক এন্ট্রি রয়েছে বাশফাক # 6 -।
চার্লস ডাফি

2
এই কাজ করে শুধুমাত্র যদি এন্ট্রিগুলির foo_1এবং foo_2হোয়াইটস্পেস এবং বিশেষ চিহ্ন মুক্ত। সমস্যাযুক্ত এন্ট্রিগুলির উদাহরণ: 'a b'ভিতরে দুটি এন্ট্রি তৈরি করবে mine''ভিতরে কোনও প্রবেশ তৈরি করবে না mine'*'ওয়ার্কিং ডিরেক্টরি সামগ্রীতে প্রসারিত হবে। আপনি এই সমস্যাগুলি উদ্ধৃত করে প্রতিরোধ করতে পারেন:eval 'mine=( "${foo_'"$i"'[@]}" )'
সোসোকি

@ সোসোকি এটি বাসে কোনও অ্যারে দিয়ে লুপিংয়ের একটি সাধারণ সমস্যা। সাময়িকভাবে আইএফএসের পরিবর্তন করেও এটি সমাধান করা যেতে পারে (এবং অবশ্যই এটি আবার পরিবর্তন করে)। উদ্ধৃতিটি কাজ করে দেখে ভাল লাগছে।
ingyhere

@ আমি যেখানেই পার্থক্য করতে চাইছি। এটা না একটি সাধারণ সমস্যা। একটি স্ট্যান্ডার্ড সমাধান আছে: সর্বদা উদ্ধৃতি [@]নির্মাণ। "${array[@]}"শব্দ বিভাজন বা বিস্তারের মতো সমস্যা ছাড়াই সর্বদা প্রবেশের সঠিক তালিকায় প্রসারিত হবে *। এছাড়াও, বিভাজন সমস্যা শব্দটি কেবল তখনই সংঘবদ্ধ করা যায় IFSযদি আপনি কোনও অ-নাল অক্ষর জানেন যা অ্যারের অভ্যন্তরে কখনও উপস্থিত না হয়। এছাড়াও এর আক্ষরিক চিকিত্সা *সেট করেও অর্জন করা যায় না IFS। হয় আপনি IFS='*'নক্ষত্রগুলিতে সেট এবং বিভক্ত হন বা আপনি সেট করেন IFS=somethingOtherএবং *প্রসারিত হয়।
সোসোই

@ সোসোকি আপনি ধরে নিচ্ছেন শেল সম্প্রসারণ অনাকাঙ্ক্ষিত এবং এটি সবসময় হয় না। সমস্ত শর্ত উদ্ধৃত করার পরে যখন শেল এক্সপ্রেশনগুলি প্রসারিত হয় না তখন বিকাশকারীরা বাগগুলির অভিযোগ করে। একটি ভাল সমাধান হ'ল ডেটা জানা এবং স্ক্রিপ্টগুলি যথাযথভাবে তৈরি করা, এমনকি আইএফএস ব্যবহার করে |বা LFহিসাবে ব্যবহার করা । আবার লুপগুলির মধ্যে সাধারণ সমস্যাটি হ'ল ডিগ্রি দ্বারা টোকেনাইজেশন ঘটে তাই টোকেনগুলি সহ প্রসারিত স্ট্রিংগুলিকে মঞ্জুরি দেওয়ার বিশেষ সমাধান হ'ল উদ্ধৃতি । (এটি হয় গ্লোব্বিং / প্যারামিটার সম্প্রসারণ বা উদ্ধৃত বর্ধিত স্ট্রিংগুলি উভয় নয়)) যদি কোনও ভার পড়তে 8 টি উদ্ধৃতি প্রয়োজন হয় তবে শেলটি ভুল ভাষা।
ingyhere

1

ইনডেক্সড অ্যারেগুলির জন্য, আপনি এগুলি তাদের মতো রেফারেন্স করতে পারেন:

foo=(a b c)
bar=(d e f)

for arr_var in 'foo' 'bar'; do
    declare -a 'arr=("${'"$arr_var"'[@]}")'
    # do something with $arr
    echo "\$$arr_var contains:"
    for char in "${arr[@]}"; do
        echo "$char"
    done
done

সহযোগী অ্যারেগুলিকে একইভাবে উল্লেখ করা যেতে পারে তবে পরিবর্তে এর পরিবর্তে -Aস্যুইচ চালু declareকরা দরকার -a


1

আপনার কাছে থাকা শেল / ব্যাশ সংস্করণটি নির্ভর করে এমন একটি অতিরিক্ত পদ্ধতি যা নির্ভর করে না envsubst। উদাহরণ স্বরূপ:

newvar=$(echo '$magic_variable_'"${dynamic_part}" | envsubst)

0

আমি কমান্ডের প্রথম যুক্তি যুক্ত একটি পরিবর্তনশীল নাম তৈরি করতে সক্ষম হতে চাই

script.sh ফাইল:

#!/usr/bin/env bash
function grep_search() {
  eval $1=$(ls | tail -1)
}

টেস্ট:

$ source script.sh
$ grep_search open_box
$ echo $open_box
script.sh

অনুসারে help eval:

শেল কমান্ড হিসাবে আর্গুমেন্ট কার্যকর করুন।


আপনি ${!var}ইতিমধ্যে উল্লিখিত হিসাবে বাশ পরোক্ষ সম্প্রসারণ ব্যবহার করতে পারেন , তবে এটি অ্যারে সূচকগুলি পুনরুদ্ধার সমর্থন করে না।


আরও পড়ুন বা উদাহরণগুলির জন্য, ইন্ডিরেশন সম্পর্কে বাশফএএইচকিউ / 006 দেখুন

POSIX বা বোর্ন শেল ছাড়া যে কার্যকারিতাটির সদৃশ করতে পারে এমন কোনও কৌশল সম্পর্কে আমরা অবগত নই eval, যা নিরাপদে করা কঠিন হতে পারে। সুতরাং, এটি আপনার নিজের ঝুঁকির হ্যাক এ ব্যবহার বিবেচনা করুন

তবে, নিম্নলিখিত নোটগুলি অনুসারে আপনার ইন্ডিয়ারেশন ব্যবহার করে পুনরায় বিবেচনা করা উচিত।

সাধারণত, ব্যাশ স্ক্রিপ্টিংয়ে আপনার মোটেও পরোক্ষ রেফারেন্সের প্রয়োজন হবে না। সাধারণত, লোকেরা এটির সমাধানের জন্য তাকান যখন তারা বাশ অ্যারেগুলি সম্পর্কে বুঝতে বা না জানে বা ফ্যাশনের মতো অন্যান্য বাশ বৈশিষ্ট্যগুলি পুরোপুরি বিবেচনা করে না।

প্যারামিটারের মধ্যে ভেরিয়েবলের নাম বা অন্য কোনও ব্যাশ সিনট্যাক্স রাখা প্রায়শই ভুল এবং অনুপযুক্ত পরিস্থিতিতে আরও ভাল সমাধান রয়েছে এমন সমস্যার সমাধানের জন্য করা হয়। এটি কোড এবং ডেটার মধ্যে পৃথকীকরণ লঙ্ঘন করে এবং এর ফলে আপনি বাগ এবং সুরক্ষা সংক্রান্ত সমস্যার দিকে পিচ্ছিল opeালকে রাখে। নির্দেশনা আপনার কোডটিকে কম স্বচ্ছ এবং অনুসরণ করতে আরও শক্ত করে তুলতে পারে।


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