ব্যাশ স্ক্রিপ্টিংয়ে, ডিক্লেয়ার এবং একটি সাধারণ ভেরিয়েবলের মধ্যে কী আলাদা?


43

বাশ স্ক্রিপ্টিংয়ে:

আমরা কেবল নামকরণ করে ভেরিয়েবল তৈরি করি:

abc=ok

বা আমরা ব্যবহার করতে পারেন declare

declare abc=ok

পার্থক্য কি?

এবং কেন বাশ একটি ভেরিয়েবল তৈরির জন্য এতগুলি উপায়ে তৈরি করে?


6
যখন কোনও ফাংশনে ব্যবহৃত হয়, কমান্ডের declareসাথে NAME কে স্থানীয় করে তোলে local-gবিকল্প এই আচরণ শুষে নেবে। দেখুন help declare
সাইরাস

2
declareসহযোগী অ্যারে, পূর্ণসংখ্যা এবং কেবল পঠনযোগ্য ভেরিয়েবলগুলি তৈরি করা সম্ভব করে। এছাড়াও, এটি তার যুক্তিগুলি প্রসারিত করে, সুতরাং এর মতো জিনিসগুলি declare $name=1সম্ভব।
চোরোবা

উত্তর:


34

থেকে help -m declare:

NAME এর

    declare - পরিবর্তনশীল মান এবং বৈশিষ্ট্য সেট করুন।

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

    declare[ -aAfFgilnrtux] [ -p] [ name[ ] ...]=value

বর্ণনা

    পরিবর্তনশীল মান এবং বৈশিষ্ট্য সেট করুন।

    ভেরিয়েবলগুলি ঘোষণা করুন এবং তাদের বৈশিষ্ট্য দিন। যদি কোনও NAMEs দেওয়া না হয় তবে সমস্ত ভেরিয়েবলের বৈশিষ্ট্য এবং মানগুলি প্রদর্শন করুন।

    বিকল্প:

      -f
        ক্রিয়াকলাপের নাম এবং সংজ্ঞাগুলিতে প্রদর্শন বা সীমাবদ্ধ করুন
      -F
        কেবলমাত্র ফাংশন নামগুলিতে প্রদর্শনকে সীমাবদ্ধ করুন (ডিবাগ করার সময় প্লাস লাইন নম্বর এবং উত্স ফাইল)
      -g
        শেল ফাংশন ব্যবহার করার সময় বৈশ্বিক ভেরিয়েবল তৈরি করুন; অন্যথায় উপেক্ষা করা
      -p
        প্রতিটি NAME এর বৈশিষ্ট্য এবং মান প্রদর্শন করুন

    বৈশিষ্ট্যগুলি সেট করে এমন বিকল্পগুলি:

      -a
        NAME- কে সূচিযুক্ত অ্যারে করতে (যদি সমর্থন করে)
      -A
        NAME- এর সহযোগী অ্যারে করতে (যদি সমর্থন করে)
      -i
        NAME এর 'পূর্ণসংখ্যা' বৈশিষ্ট্য তৈরি করতে
      -l
        নিয়োগের ক্ষেত্রে ছোট কেসগুলিতে NAME কে রূপান্তর করতে
      -n
        NAME কে এর মান অনুসারে চলকটির রেফারেন্স করুন make
      -r
        নামগুলি কেবল পঠনযোগ্য করে তুলতে
      -t
        NAME এর 'ট্রেস' বৈশিষ্ট্য তৈরি করতে
      -u
        অ্যাসাইনমেন্টের উপর NAME কে আপার কেস রূপান্তর করতে
      -x
        NAME রফতানি করতে

    ' +' এর পরিবর্তে ' ' ব্যবহার করা -প্রদত্ত বৈশিষ্ট্যটি বন্ধ করে দেয়।

    ভেরিয়েবলের letকোনও মান নির্ধারিত হওয়ার পরে পূর্ণসংখ্যার বৈশিষ্ট্যযুক্ত ভেরিয়েবলগুলিতে পাটিগণিত মূল্যায়ন হয় ( কমান্ডটি দেখুন) সম্পাদিত হয়।

    যখন কোনও ফাংশনে ব্যবহৃত হয়, কমান্ডের declareসাথে NAME কে স্থানীয় করে তোলে local। ' -g' বিকল্পটি এই আচরণটি দমন করে।

    প্রস্থান স্থিতি:
    অবৈধ বিকল্প সরবরাহ না করা বা একটি ভেরিয়েবল অ্যাসাইনমেন্ট ত্রুটি না হলে সাফল্য ফেরায়।

আরো দেখুন

    ব্যাশ (1)

বাস্তবায়ন

    জিএনইউ বাশ, সংস্করণ ৪.৩.১১ (১) -রিলেজ (i686-pc-linux-gnu)
    কপিরাইট (সি) 2013 ফ্রি সফটওয়্যার ফাউন্ডেশন, ইনক।
    লাইসেন্স জিপিএলভি 3 +: জিএনইউ জিপিএল সংস্করণ 3 বা তার পরে <http://gnu.org/ লাইসেন্স / gpl.html>


সুতরাং, declareপরিবর্তনশীল মান এবং বৈশিষ্ট্য নির্ধারণের জন্য ব্যবহৃত হয় ।

আমি খুব সাধারণ উদাহরণ সহ দুটি বৈশিষ্ট্যের ব্যবহার দেখাই:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

উপরের উদাহরণ থেকে আমার মনে হয় আপনার declareস্বাভাবিক ভেরিয়েবলের চেয়ে ভেরিয়েবলের ব্যবহারটি বোঝা উচিত ! এই ধরণের declareএশনটি ফাংশনে কার্যকর হয়, স্ক্রিপ্টিং সহ লুপ হয়।

এছাড়াও পরিদর্শন টাইপিং ভেরিয়েবল: ঘোষণা বা typeset


হ্যাঁ, "এবং গুণাবলী" হ'ল মূল বিষয়! এই পার্থক্য।
lovespring

গ্রেট! আমি উদাহরণ পছন্দ করি, শেখানোর / শেখার সর্বোত্তম উপায়। ধন্যবাদ!
টার্কেনহে

1
এই উত্তরটি বুঝতে আপনার "গুণাবলী" কী তা জানতে হবে। এগুলি 'পূর্ণসংখ্যা', 'অ্যারে' বা 'পঠনযোগ্য' এর মতো ভেরিয়েবলের বৈশিষ্ট্য।
নওম্যানন

11

abc=okভেরিয়েবলের জন্য একটি মান নির্ধারণ করে abcdeclare abcবলা হয় একটি ভেরিয়েবল ঘোষণা abc। দুটি হিসাবে একত্রিত করা যেতে পারে declare abc=ok

ব্যাশ, অন্যান্য শাঁস মত, স্ট্রিং এবং অ্যারে ভেরিয়েবল ঘোষণা করা প্রয়োজন না, তাই declareযদি না আপনি অপশন পাস, যেমন চান প্রয়োজন হয় না declare -A abcকরতে abcএকটি মিশুক অ্যারে বা declare -rএকটি পরিবর্তনশীল কেবলমাত্র-পাঠ্য করা। যাইহোক, একটি ফাংশনের অভ্যন্তরে, declareএকটি পার্থক্য করে: এটি ফাংশনের পরিবর্তে ভেরিয়েবলকে স্থানীয় করে তোলে যার অর্থ ফাংশনের বাইরে ভেরিয়েবলের মান (যদি থাকে) সংরক্ষণ করা হয়। (আপনি যদি না ব্যবহার করেন declare -gযা ভেরিয়েবলটিকে স্থানীয় নয়; এটি অন্যান্য বিকল্পের সাথে মিলিত হলে কার্যকর হয়, উদাহরণস্বরূপ declare -gAকোনও ফাংশনে একটি গ্লোবাল এসোসিয়েটিভ অ্যারে তৈরি করতে)) উদাহরণ:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

আউটপুট:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

declareবিল্টিনের সাথে আপনি আরও একটি জিনিস করতে পারেন

declareBuiltin ব্যাশ জন্য অনন্য হয়। এটি দৃ strongly়ভাবে অনুপ্রাণিত এবং ksh এর typesetবিল্টিনের খুব কাছাকাছি , এবং বাশ সামঞ্জস্যের typesetপ্রতিশব্দ হিসাবে সরবরাহ করে declare। (বাশ কেন কেবল এটি কল করেনি তা আমি জানি না typeset)। তৃতীয় প্রতিশব্দ আছে local,। এর রয়েছে export, যা হিসাবে একই declare -x, আবার সামঞ্জস্যের জন্য (প্রতি বোর্ন ধাঁচের শেল সহ)।


হ্যাঁ! 'এবং বিকল্প' পয়েন্ট। পিএস যদি আমি বাশ ডিজাইন করি, তবে আমি "ঘোষণা" এর আচরণকে আলাদা আলাদাভাবে কিছু করতে দেব। এটি জিনিস সহজ করে তোলে।
lovespring

চমৎকার উত্তর. আরও প্রশ্ন হলো, মাঝে যা এক export, localএবং declareঅন্যান্য শাঁস সঙ্গে সবচেয়ে সামঞ্জস্যপূর্ণ?
0xc0de

1
@ 0xc0de exportসব রূপের বিদ্যমান shlocalকেবল ব্যাশ এবং zsh এ declareকেবলমাত্র ব্যাশে বিদ্যমান । typesetksh, bash এবং zsh এ বিদ্যমান।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.