বাশ শেল স্ক্রিপ্টে কোনও স্ট্রিং সংজ্ঞায়িত না হলে কীভাবে বলা যায়


151

আমি যদি নাল স্ট্রিংটি পরীক্ষা করতে চাই তবে আমি করতাম

[ -z $mystr ]

তবে আমি যদি ভেরিয়েবলটি আদৌ সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করতে চাই? বা বাশ স্ক্রিপ্টিং এর মধ্যে কোন পার্থক্য নেই?


27
দয়া করে [-z "$ মাইস্টার"] ব্যবহার করার অভ্যাসে থাকুন [-z $ মাইস্টার]
চার্লস ডাফি

বিপরীত জিনিসটি কীভাবে করবেন? আমি বোঝাতে চাইছি যখন স্ট্রিংটি নাল নয়
খোলা হবে

1
@ ফ্লো: কী সম্পর্কে[ -n "${VAR+x}"] && echo not null
লেকেনস্টেইন

1
@ চার্লসডুফি আমি অনলাইনে প্রচুর সংস্থানেই এর আগে পড়েছি। কেন এটাকে প্রাধান্য দেওয়া হয়?
ffledgling

6
আইওস কারণ আপনার যদি উক্তি নেই তবে চলকের বিষয়বস্তু স্ট্রিং-বিভক্ত এবং গ্লোববেড; যদি এটি একটি খালি স্ট্রিং হয় তবে এটি [ -z ]পরিবর্তে হয়ে যায় [ -z "" ]; যদি এটির ফাঁকা স্থান থাকে তবে এটি [ -z "my" "test" ]পরিবর্তে হয়ে যায় [ -z my test ]; এবং যদি এটি হয় [ -z * ]তবে *আপনার ডিরেক্টরিতে ফাইলগুলির নামের সাথে প্রতিস্থাপন করা হবে।
চার্লস ডাফি

উত্তর:


138

আমি উত্তর তোমার পরে হয় উহ্য হয় মনে (যদি বিবৃত নয়) Vinko এর উত্তর , যদিও এটা শুধু বানান আউট করা হয় না। ভিএআর সেট করা আছে কি না তা ফাঁকা রয়েছে কি না সেট করার জন্য আপনি ব্যবহার করতে পারেন:

if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi

আপনি সম্ভবত দ্বিতীয় লাইনের দুটি পরীক্ষার সাথে একটির সাথে একত্রিত করতে পারেন:

if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi

যাইহোক, যদি আপনি Autoconf জন্য ডকুমেন্টেশন পড়ুন, আপনি যে তারা 'পদ মিশ্রন সুপারিশ করি না পাবেন -a' এবং সঙ্গে মিলিত পৃথক সহজ পরীক্ষা ব্যবহার করার প্রস্তাব না &&। আমি এমন কোনও সিস্টেমের মুখোমুখি হইনি যেখানে সমস্যা আছে; এর অর্থ এই নয় যে তাদের অস্তিত্ব ছিল না (তবে তারা এই দিনগুলিতে খুব বিরল, এমনকি যদি তারা অতীতের মতো বিরল নাও হত)।

আপনি এই বিবরণ, এবং অন্যান্য সংশ্লিষ্ট জানতে পারেন শেল প্যারামিটার প্রসারণও , testবা[ কমান্ড শর্তাধীন অভিব্যক্তি ব্যাশ ম্যানুয়াল।


এই প্রশ্নের উত্তর সম্পর্কে আমাকে সম্প্রতি ইমেলের মাধ্যমে জিজ্ঞাসা করা হয়েছিল:

আপনি দুটি পরীক্ষা ব্যবহার করুন, এবং আমি দ্বিতীয়টি ভালভাবে বুঝতে পারি, তবে প্রথমটি নয়। আরও স্পষ্টভাবে আমি পরিবর্তনশীল প্রসারণের প্রয়োজনীয়তা বুঝতে পারি না

if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi

এটি কি একই কাজ করবে না?

if [ -z "${VAR}" ]; then echo VAR is not set at all; fi

সুষ্ঠু প্রশ্ন - উত্তরটি 'না, আপনার সহজ বিকল্পটি একই জিনিস করে না' do

ধরুন আমি আপনার পরীক্ষার আগে এটি লিখেছি:

VAR=

আপনার পরীক্ষা বলবে "VAR মোটেও সেট করা নেই", তবে আমার বলবে (জড়িত হয়ে কারণ এটি কিছুই প্রতিধ্বনিত করে না) "VAR সেট করা আছে তবে এর মান খালি থাকতে পারে"। এই স্ক্রিপ্ট চেষ্টা করুন:

(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ];     then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ];     then echo MP:2 VAR is not set at all; fi
)

আউটপুটটি হ'ল:

JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all

পরীক্ষার দ্বিতীয় জোড়ায়, চলকটি সেট করা থাকে তবে এটি খালি মানটিতে সেট করা থাকে। এটি স্বতন্ত্র ${VAR=value}এবং ${VAR:=value}স্বরলিপিগুলি তৈরি করে। জন্য পূর্বোক্ত ${VAR-value}এবং ${VAR:-value}, এবং ${VAR+value}এবং ${VAR:+value}, ইত্যাদি।


হিসাবে Gili থেকে তার আউট পয়েন্ট উত্তর , যদি আপনি চালাতে bashসঙ্গে set -o nounsetবিকল্প, তারপর মৌলিক উত্তর উপরোক্ত সঙ্গে ব্যর্থ unbound variable। এটি সহজে প্রতিকার করা হয়:

if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi

অথবা আপনি ( সমতুল্য ) এর set -o nounsetসাথে বিকল্পটি বাতিল করতে পারেন ।set +uset -uset -o nounset


7
এই উত্তরের সাথে আমার একমাত্র সমস্যাটি হ'ল এটি একটি কাজকে বরং পরোক্ষ এবং অস্পষ্ট ফ্যাশনে সম্পাদন করে।
সুইস

3
যাঁরা বাশ ম্যান পৃষ্ঠাতে উপরের অর্থের বর্ণনাটি দেখতে চান, তাদের জন্য "প্যারামিটার সম্প্রসারণ" বিভাগটি দেখুন এবং তারপরে এই পাঠ্যের জন্য: "নীচের নথিভুক্ত ফর্মগুলি ব্যবহার করে সাবস্ট্রিং সম্প্রসারণ সম্পাদন না করার জন্য, বাশ পরীক্ষার জন্য প্যারামিটারটি সেট না করা বা নাল ['নাল' এর অর্থ শূন্য স্ট্রিং] the নাল বা আনসেট করা, কিছুই প্রতিস্থাপন করা হয় না, না হলে শব্দের বিস্তৃতি প্রতিস্থাপিত হয় "
ডেভিড টনহোফার

2
@ সুইস এটি অস্পষ্ট বা অপ্রত্যক্ষ নয়, তবে মূর্তিমান। সম্ভবত কোনও প্রোগ্রামারের সাথে অপরিচিত ${+}এবং ${-}এটি অস্পষ্ট, তবে যদি শেলটির একজন দক্ষ ব্যবহারকারী হতে হয় তবে সেই কনস্ট্রাক্টগুলির সাথে পরিচিতি অপরিহার্য।
উইলিয়াম পার্সেল

আপনি যদি সক্ষম করে এটি প্রয়োগ করতে চান তবে stackoverflow.com/a/20003892/14731 দেখুন set -o nounset
গিলি

আমি এ বিষয়ে প্রচুর পরীক্ষা করেছি; কারণ আমার স্ক্রিপ্টগুলির ফলাফলগুলি অসংলগ্ন ছিল। আমি বাশ-এর ভি 4.2 এবং এর বাইরেও " [ -v VAR ]" পদ্ধতির লোকায়নের পরামর্শ দিই ।
হবে

38
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO=""
~> if [ -z $FOO ]; then echo "EMPTY"; fi
EMPTY
~> FOO="a"
~> if [ -z $FOO ]; then echo "EMPTY"; fi
~> 

-z অপরিজ্ঞাত ভেরিয়েবলের জন্যও কাজ করে। অনির্ধারিত এবং এর মাঝে পার্থক্যটা একটি নির্ধারিত জিনিস তালিকাভুক্ত ব্যবহার করতে চাই এখানে , বা, পরিষ্কার ব্যাখ্যা সঙ্গে এখানে

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

বিকল্প শব্দ:

~$ unset FOO
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
~$ FOO=""
~$ if test ${FOO+defined}; then echo "DEFINED"; fi
DEFINED

ডিফল্ট মান:

~$ FOO=""
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
~$ unset FOO
~$ if test "${FOO-default value}" ; then echo "UNDEFINED"; fi
UNDEFINED

অবশ্যই আপনি এর মধ্যে একটি আলাদাভাবে ব্যবহার করবেন, 'ডিফল্ট মান' এর পরিবর্তে আপনার পছন্দসই মানটি রেখে এবং যথাযথ হলে সরাসরি প্রসারণটি ব্যবহার করে।


1
তবে আমি স্ট্রিংটি "" বা কখনও সংজ্ঞায়িত হয়নি কিনা তার মধ্যে পার্থক্য করতে চাই। এটা কি সম্ভব?
Setjmp

1
এই উত্তরটি নেই কিভাবে এই দুটি মামলা মধ্যে পার্থক্য বলুন; এটি আরও আলোচনার জন্য বাশ ফ্যাক্স লিঙ্কটি অনুসরণ করুন।
চার্লস ডাফি

1
আমি যুক্ত করেছি যে তার মন্তব্যের পরে, চার্লস
ভিনকো ভ্র্যাসালোভিক

2
এই সমস্ত "কৌশল" এর জন্য ব্যাশ ম্যান পৃষ্ঠাতে "প্যারামিটার সম্প্রসারণ" সন্ধান করুন। উদাহরণস্বরূপ a {foo: -default a একটি ডিফল্ট মান ব্যবহার করতে, default {foo: = default the ডিফল্ট মান নির্ধারণ করতে, oo {foo
:?

18

উন্নত বাশ স্ক্রিপ্টিং গাইড, 10.2। পরামিতি প্রতিস্থাপন:

  • $ {var + blahblah}: var সংজ্ঞায়িত করা হলে, 'blahblah' এক্সপ্রেশন জন্য প্রতিস্থাপিত হয়, অন্যথায় নাল প্রতিস্থাপিত হয়
  • {{var-blahblah}: var সংজ্ঞায়িত করা হয়, এটি নিজেই প্রতিস্থাপিত হয়, অন্যথায় 'blahblah' প্রতিস্থাপন করা হয়
  • । {var? blahblah}: যদি বর্ণটি সংজ্ঞায়িত করা হয় তবে এটি প্রতিস্থাপন করা হয়, অন্যথায় ফাংশনটি 'ব্লেব্লাহ' এর সাথে একটি ত্রুটি বার্তা হিসাবে উপস্থিত রয়েছে।


আপনার প্রোগ্রামটির যুক্তি ভিত্তিক করতে ভ্যারিয়েবল $ মাইরিস্ট সংজ্ঞায়িত হয়েছে কি না, আপনি নিম্নলিখিতটি করতে পারেন:

isdefined=0
${mystr+ export isdefined=1}

এখন, যদি isdefined = 0 হয় তবে ভেরিয়েবলটি অপরিজ্ঞাত ছিল, যদি isdefines = 1 চলকটি সংজ্ঞায়িত করা হয়েছিল

উপরের উত্তরের চেয়ে ভেরিয়েবলগুলি পরীক্ষা করার এই পদ্ধতিটি আরও উত্তম, কারণ এটি আরও মার্জিত, পঠনযোগ্য এবং আপনার ব্যাশ শেল যদি অপরিজ্ঞাত ভেরিয়েবলগুলির ব্যবহারের ক্ষেত্রে ত্রুটির সাথে কনফিগার করা থাকে (set -u), তবে স্ক্রিপ্টটি অকালে শেষ হয়ে যাবে।


অন্যান্য দরকারী জিনিস:

$ মাইস্টারকে নির্ধারিত যদি to এর ডিফল্ট মান নির্ধারণ করা হয় এবং অন্যথায় এটি অক্ষত রেখে দিন:

mystr=${mystr- 7}

একটি ত্রুটি বার্তা মুদ্রণ করতে এবং ভেরিয়েবল অপরিবর্তিত থাকলে ফাংশন থেকে প্রস্থান করতে:

: ${mystr? not defined}

এখানে সতর্ক থাকুন যে আমি ':' ব্যবহার করেছি যাতে $ মাইরিস্টের বিষয়বস্তু যাতে সংজ্ঞায়িত না হয় সেটিকে কমান্ড হিসাবে কার্যকর করা যায়।


আমি কি জানতাম না? বেস ভেরিয়েবলের জন্য সিনট্যাক্স। এটি একটি দুর্দান্ত ক্যাচ।
সুইস

এটি পরোক্ষ চলক উল্লেখগুলির সাথেও কাজ করে। এই পাসের: var= ; varname=var ; : ${!varname?not defined}এবং এই বন্ধ: varname=var ; : ${!varname?not defined}। তবে এটি ব্যবহার করা ভাল অভ্যাস set -uযা একই কাজটি আরও সহজ করে তোলে।
16

11

পরীক্ষার সংক্ষিপ্তসার।

[ -n "$var" ] && echo "var is set and not empty"
[ -z "$var" ] && echo "var is unset or empty"
[ "${var+x}" = "x" ] && echo "var is set"  # may or may not be empty
[ -n "${var+x}" ] && echo "var is set"  # may or may not be empty
[ -z "${var+x}" ] && echo "var is unset"
[ -z "${var-x}" ] && echo "var is set and empty"

বাশ ভাল অনুশীলন। কখনও কখনও ফাইলের পাথগুলিতে স্পেস থাকে বা কমান্ড ইঞ্জেকশন থেকে রক্ষা করতে
k107

1
আমি মনে করি এর সাথে ${var+x}ভেরিয়েবলের নামগুলিতে ফাঁকা থাকার অনুমতি দেওয়া ছাড়া এটি প্রয়োজনীয় নয় ।
অ্যান ভ্যান রসুম

শুধু ভাল অনুশীলন নয়; এটা হচ্ছে প্রয়োজনীয় সঙ্গে [সঠিক ফলাফল পেতে। যদি varসেট না করা বা খালি থাকে তবে প্রস্থান স্থিতি [ -n $var ]হ্রাস করে [ -n ]0, যখন [ -n "$var" ]প্রত্যাশিত (এবং সঠিক) প্রস্থান স্থিতি রয়েছে 1.
চিপনার

5

https://stackoverflow.com/a/9824943/14731 এর একটি আরও ভাল উত্তর রয়েছে (এটি আরও পাঠযোগ্য এবং সক্ষমের সাথে কাজ করে set -o nounset)। এটি মোটামুটি এর মতো কাজ করে:

if [ -n "${VAR-}" ]; then
    echo "VAR is set and is not empty"
elif [ "${VAR+DEFINED_BUT_EMPTY}" = "DEFINED_BUT_EMPTY" ]; then
    echo "VAR is set, but empty"
else
    echo "VAR is not set"
fi

4

একটি পরিবর্তনশীল সংজ্ঞায়িত হচ্ছে তা পরীক্ষা করার সুস্পষ্ট উপায় হ'ল:

[ -v mystr ]

1
ম্যান পেজগুলির কোনওটিতেই এটি খুঁজে পাওয়া যায় না (ব্যাশ বা পরীক্ষার জন্য) তবে এটি আমার পক্ষে কাজ করে .. কোন সংস্করণটি যুক্ত হয়েছিল তা কোন ধারণা?
অ্যাশ বার্লিন-টেলর

1
এটি শর্তসাপেক্ষ এক্সপ্রেশনগুলিতে নথিভুক্ত করা হয়েছে , বোর্ন শেল বিল্টিনসtest বিভাগে লেজ প্রান্তে অপারেটর থেকে রেফারেন্স করা হয়েছে । এটি কখন যুক্ত করা হয়েছিল তা আমি জানি না, তবে এটি অ্যাপল সংস্করণে ( 3.2.51 ভিত্তিক ) নেই, তাই এটি সম্ভবত একটি 4.x বৈশিষ্ট্য। bashbash
জোনাথন লেফলার

1
এটি আমার পক্ষে কাজ করে না GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)। ত্রুটিটি হ'ল -bash: [: -v: unary operator expectedএখানে একটি মন্তব্য প্রতি , এটি কাজ করতে সর্বনিম্ন বাশ 4.2 প্রয়োজন।
একিউম্যানাস

এটি কখন উপলব্ধ হবে তা যাচাই করার জন্য ধন্যবাদ। আমি এটি আগে বিভিন্ন সিস্টেমে ব্যবহার করেছিলাম, তবে হঠাৎ এটি কার্যকর হয়নি। আমি কৌতূহল থেকে এখানে এসেছি এবং হ্যাঁ, অবশ্যই এই সিস্টেমে বাশ একটি 3.x বাশ।
ক্লেক

1

অন্য বিকল্প: "তালিকা অ্যারে সূচকগুলি" সম্প্রসারণ :

$ unset foo
$ foo=
$ echo ${!foo[*]}
0
$ foo=bar
$ echo ${!foo[*]}
0
$ foo=(bar baz)
$ echo ${!foo[*]}
0 1

fooআনসেট থাকা অবস্থায় খালি স্ট্রিংয়ের কেবলমাত্র এটি প্রসারিত হওয়ার পরে , আপনি এটি স্ট্রিং শর্তসাপেক্ষে পরীক্ষা করতে পারেন:

$ unset foo
$ [[ ${!foo[*]} ]]; echo $?
1
$ foo=
$ [[ ${!foo[*]} ]]; echo $?
0
$ foo=bar
$ [[ ${!foo[*]} ]]; echo $?
0
$ foo=(bar baz)
$ [[ ${!foo[*]} ]]; echo $?
0

যে কোনও বাশ সংস্করণ> = 3.0 এ পাওয়া উচিত


1

এই বাইকটি আরও চালিত করার জন্য নয়, তবে যুক্ত করতে চেয়েছিল

shopt -s -o nounset

স্ক্রিপ্টের শীর্ষে আপনি এমন কিছু যুক্ত করতে পারেন যা স্ক্রিপ্টের কোথাও ভেরিয়েবল ঘোষণা না করলে ত্রুটি হবে । আপনি যে বার্তাটি দেখতে পেয়েছেন তা হ'ল unbound variableতবে অন্যরা যেমন উল্লেখ করেছেন এটি কোনও খালি স্ট্রিং বা নাল মান ধরবে না। কোনও পৃথক মান শূন্য নয় তা নিশ্চিত করার জন্য, আমরা একটি পরিবর্তনশীল এটির সাথে প্রসারিত হওয়ার সাথে পরীক্ষা করতে পারি ${mystr:?}, ডলার চিহ্ন বিস্তৃতি হিসাবেও পরিচিত, যা ত্রুটিযুক্ত হবে parameter null or not set


1

ব্যাশ রেফারেন্স ম্যানুয়াল ব্যাশ সম্পর্কে তথ্য একজন প্রামাণিক উৎস।

কোনও ভেরিয়েবলের উপস্থিতি আছে কিনা তা পরীক্ষা করার উদাহরণ এখানে:

if [ -z "$PS1" ]; then
        echo This shell is not interactive
else
        echo This shell is interactive
fi

( বিভাগ 6.3.2 থেকে ।)

মনে রাখবেন যে, খোলা পরে হোয়াইটস্পেস [আগে ]হয় ঐচ্ছিক না


ভিম ব্যবহারকারীদের জন্য টিপস

আমার একটি স্ক্রিপ্ট ছিল যা এর নীচে বেশ কয়েকটি ঘোষণা ছিল:

export VARIABLE_NAME="$SOME_OTHER_VARIABLE/path-part"

তবে আমি চেয়েছিলাম যে সেগুলি যে কোনও বিদ্যমান মানের থেকে পিছিয়ে হোক। সুতরাং এগুলি দেখতে আমি তাদের আবার লিখেছিলাম:

if [ -z "$VARIABLE_NAME" ]; then
        export VARIABLE_NAME="$SOME_OTHER_VARIABLE/path-part"
fi

আমি একটি দ্রুত রেইগেক্স ব্যবহার করে ভিমে এটি স্বয়ংক্রিয় করতে সক্ষম হয়েছি:

s/\vexport ([A-Z_]+)\=("[^"]+")\n/if [ -z "$\1" ]; then\r  export \1=\2\rfi\r/gc

এটি দৃশ্যত প্রাসঙ্গিক লাইনগুলি নির্বাচন করে, তারপরে টাইপ করে প্রয়োগ করা যেতে পারে :। কমান্ড বারটি প্রি-পপুলেট করে :'<,'>। উপরের কমান্ডটি পেস্ট করুন এবং এন্টার টিপুন।


ভিমের এই সংস্করণে পরীক্ষিত:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Aug 22 2015 15:38:58)
Compiled by root@apple.com

উইন্ডোজ ব্যবহারকারীরা বিভিন্ন লাইন শেষ করতে পারে want


0

ভেরিয়েবল সংজ্ঞায়িত হয়েছে কিনা তা যাচাই করার জন্য এখানে আমি কী আরও পরিষ্কার পদ্ধতি মনে করি:

var_defined() {
    local var_name=$1
    set | grep "^${var_name}=" 1>/dev/null
    return $?
}

এটি নিম্নলিখিত হিসাবে ব্যবহার করুন:

if var_defined foo; then
    echo "foo is defined"
else
    echo "foo is not defined"
fi

1
কোনও ফাংশন লেখা খারাপ ধারণা নয়; অনুরোধ grepকরা ভয়ঙ্কর। নোটটি যে কোনও ভেরিয়েবলের নাম সুনির্দিষ্ট করে তার মান পাওয়ার উপায় হিসাবে bashসমর্থন করে যাতে ফলন হয় । ${!var_name}$var_namename=value; value=1; echo ${name} ${!name}value 1
জোনাথন লেফলার

0

অপরিজ্ঞাত ভেরিয়েবল পরীক্ষা করার জন্য একটি সংক্ষিপ্ত সংস্করণ কেবলমাত্র হতে পারে:

test -z ${mystr} && echo "mystr is not defined"

-3

কোনও যুক্তি ছাড়াই কল সেট করুন .. এটি সমস্ত সংজ্ঞাযুক্ত ওয়ারগুলি আউটপুট করে দেয় .. তালিকার শেষেরগুলি
আপনার স্ক্রিপ্টে সংজ্ঞায়িত করা হবে ..
সুতরাং আপনি এর আউটপুট এমন কোনও কিছুর সাথে পাইপ করতে পারবেন যা জিনিসগুলি সংজ্ঞায়িত এবং কোনটি নয় তা নির্ধারণ করতে পারে


2
আমি এটিকে ভোট দিয়েছি না, তবে এটি একটি ছোট্ট বাদামকে ফাটিয়ে ফেলা এক স্লেজহ্যামারের কিছু।
জোনাথন লেফলার

আমি এই উত্তরটি গ্রহণযোগ্য উত্তরের চেয়ে ভাল পছন্দ করি। এই উত্তরে কী করা হচ্ছে তা স্পষ্ট। গৃহীত উত্তরটি নরক হিসাবে মজাদার।
সুইস 0

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