ব্যাশ ভেরিয়েবলগুলি সূচনা করা - এটি কী আপনার প্রয়োজন হিসাবে প্রস্তাবিত বা সংজ্ঞায়িত করা উচিত?


9

মূল কোডের আগে স্ক্রিপ্টে বাশ ভেরিয়েবলের মান শুরু করার কোনও সুবিধা / অসুবিধা আছে কি না, আসল মান নির্ধারণের আগে কোনও ফাংশনে স্থানীয় ভেরিয়েবলগুলি?

আমার কি এমন কিছু করার দরকার আছে:

init()
{
    name=""
    name=$1
}

init "Mark"

আবর্জনার মানগুলি (যদি আরম্ভ না করা হয়) এবং ভেরিয়েবলের মানগুলির নেতিবাচক প্রভাব ফেলতে পারে তবে ভেরিয়েবলের কোনও ঝুঁকি রয়েছে কি?


2
আপনি এই ধারণাটি কোথায় পেলেন?

6
@ ডরিটোস্টাইল ওয়েল, যদি কোনও নিম্ন স্তরের ভাষা যেমন সি এর জন্য ব্যবহার করা হয়, তবে এটি উদ্বিগ্ন হওয়ার জন্য এটি পুরোপুরি বৈধ বিষয়।
কুসালানন্দ

@ কুসালানন্দ সি কোডটির সমতুল্য নয় name = ""; name = argv[1];? এবং এটি ঠিক যেমন অর্থহীন নয়?
জোসেফ সিবিল-রিইনস্টেট মনিকা

1
@ জোসেফসিবল-রিইনস্টেটমোনিকা হ্যাঁ। আপনি যে সি কোড পোস্ট করেছেন তা অর্থহীন। সিতে, যদিও শেলের বিপরীতে, অবিচ্ছিন্ন ভেরিয়েবলগুলির নির্দিষ্ট কোনও নির্দিষ্ট সংজ্ঞা দেওয়া মান থাকে না। এর অর্থ সি এর মতো ভাষাগুলিতে ভেরিয়েবলের সূচনা করা অনেক পরিস্থিতিতে বোধগম্য হয়। শেলের মধ্যে এটি করার প্রয়োজন হয় না। সি একটি পরিবর্তনশীল আরম্ভ শুধুমাত্র অবিলম্বে অন্য মান সেট করতে অর্থহীন, যেমনটা আপনি বাতলান।
কুসালানন্দ

উত্তর:


22

কোনও ভেরিয়েবলের জন্য খালি স্ট্রিং বরাদ্দ করার এবং তারপরে তত্ক্ষণাত অন্য ভেরিয়েবল স্ট্রিং নির্ধারণের কোনও সুবিধা নেই। শেল ভেরিয়েবলের কোনও মান নির্ধারণের ফলে তার পূর্ববর্তী মানটি সম্পূর্ণরূপে ওভাররাইট হয়ে যাবে।

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

কোনও আনসেট ভেরিয়েবল, কোনও স্ক্রিপ্ট শুরু হওয়ার পরে অব্যবহৃত বা স্পষ্টভাবে unsetকমান্ডটি চালিয়ে আনসেট করা হওয়ার কোনও মূল্য থাকবে না। এ জাতীয় পরিবর্তকের মান কিছুই হবে না। যদি এটি হিসাবে ব্যবহৃত হয় তবে "$myvariable"আপনি এর সমতুল্য পাবেন ""এবং আপনি কখনই "আবর্জনা ডেটা" পাবেন না।

শেল অপশনটি nounsetযদি হয় set -o nounsetবা একটির সাথে সেট করা থাকে set -u, তবে একটি আনসেট ভেরিয়েবল উল্লেখ করার ফলে শেলটি একটি ত্রুটি তৈরি করে (এবং একটি অ-ইন্টারেক্টিভ শেলটি সমাপ্ত হবে):

$ set -u
$ echo "$myvariable"
/bin/sh: myvariable: parameter not set

বা, এতে bash:

$ set -u
$ echo "$myvariable"
bash: myvariable: unbound variable

যদি ভেরিয়েবলের নামটি বিদ্যমান পরিবেশের ভেরিয়েবলের সাথে মিলে যায় তবে শেল ভেরিয়েবলগুলি পরিবেশ দ্বারা সূচনা করা হবে।

যদি আপনি আশা করেন যে আপনি এমন একটি পরিবর্তনশীল ব্যবহার করছেন যা পরিবেশের মাধ্যমে এইভাবে শুরু করা যেতে পারে (এবং যদি এটি অযাচিত হয়) তবে আপনি স্পষ্টভাবে এটি আপনার স্ক্রিপ্টের মূল অংশের আগে আনসেট করতে পারেন:

unset myvariable    # unset so that it doesn't inherit a value from the environment

যা এটি পরিবেশের পরিবর্তনশীল হিসাবেও সরিয়ে ফেলবে, বা, আপনি কেবল তার প্রাথমিক মানটি উপেক্ষা করতে পারেন এবং কেবল একটি অ্যাসাইনমেন্ট দিয়ে ওভাররাইট করতে পারেন (এটি পরিবেশের পরিবর্তনশীল পরিবর্তনের মানকেও পরিণত করবে)।

আপনি কখনই শেল ভেরিয়েবলে অবিচ্ছিন্ন আবর্জনার মুখোমুখি হবেন না (যদি না বলা থাকে যে আবর্জনা ইতিমধ্যে একই নামে পরিবেশে পরিবর্তনশীল থাকে))


3
একটি খালি মানের সাথে ভেরিয়েবল সেট করার কোনও মূল্য নেই এবং তারপরে ওপি আক্ষরিকভাবে এটি সেট করার সাথে সাথে এটি গণনাতে সেট করার unsetজন্য কোনও ধরণের forবা whileলুপ চালানোর আগে খালি মান (বা টিং) নির্ধারণ করার মান রয়েছে শর্ত (গুলি) পূরণ না হওয়ার কারণে লুপটি আসলে চালিত হবে না এমন কোনও সম্ভাবনা রয়েছে; এবং ভেরিয়েবলটি স্ক্রিপ্টটি উত্তরাধিকারসূত্রে প্রাপ্ত পরিবেশে অন্য কোনও মানতে সেট করা যেতে পারে। তবে যুক্তিযুক্তভাবে ভাল যে সমস্ত কিছু main()একটিতে রাখা এবং ভেরিয়েবলগুলি হিসাবে সংজ্ঞায়িত করা local
মন্টি হার্ডার

আপনি প্যারামিটার :${myvariable-defaultvalue}
এক্সপেনশন

3

সম্পাদনা : ওফস, দৃশ্যত ঘোষণাটি আরম্ভের থেকে পৃথক। আমি এটিকে যাইহোক এখানে ছেড়ে যাব তাই আমার মতো নবাগত কোডাররা আমার ভুল থেকে শিখতে পারে।


কোনও ফাংশনে স্থানীয় ভেরিয়েবলগুলি ঘোষণার সুবিধাটি হ'ল আপনি সহজেই কোডটি অনুলিপি করতে পারেন।

উদাহরণস্বরূপ, বলুন আমার একটি ফাংশন রয়েছে:

foo(){
    local name
    name="$1"
    echo "$name"
}

যদি আমি এটিকে কোনও স্ক্রিপ্ট তৈরি করতে চাই তবে আমি কেবল localবিবৃতিটি উপেক্ষা করে অন্য সমস্ত কিছু অনুলিপি করছি:

#!/bin/bash
name="$1"
echo "$name"

যদি ঘোষণা এবং অ্যাসাইনমেন্ট একই লাইনে থাকে তবে localঅংশটি স্ক্রিপ্টে রূপান্তরিত করার আগে আমাকে নিজেই সম্পাদনা করতে হবে:

foo(){
    local name="$1"
    echo "$name"
}

এই উদাহরণে এটি কোনও বড় বিষয় নয়, তবে আপনি যদি আরও বড়, আরও জটিল ক্রিয়াকলাপগুলি নিয়ে কাজ করে থাকেন তবে এটি আরও বেদনাদায়ক হতে পারে।


1
প্রশ্নটি ঘোষণা এবং আরম্ভের সংমিশ্রণ সম্পর্কে নয়। এটি একটি আসল মান নির্ধারণের আগে খালি মান দিয়ে আরম্ভ করার বিষয়ে ছিল।
বার্মার

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