কম্পিউটার সায়েন্সে (এবং সাধারন কম্পিউটিং-এ) একটি ভেরিয়েবল হলো মেমোরিতে একটি লোকেশন যা পরবর্তী ব্যবহারের জন্য নির্বিচারে তথ্য ধারণ করে। অন্য কথায়, এটি একটি অস্থায়ী স্টোরেজ কন্টেইনার যেখানে আপনি ডেটা রাখতে এবং বের করতে পারেন। বাশ শেলে, সেই ডেটা হতে পারে একটি শব্দ (কম্পিউটার ভাষায় স্ট্রিং) বা একটি সংখ্যা (একটি ইন্টিজার)।
আপনি হয়তো কখনো নিজের কম্পিউটারে সচেতনভাবে ভেরিয়েবল ব্যবহার করেননি, কিন্তু আপনার জীবনের অন্যান্য ক্ষেত্রে ভেরিয়েবল ব্যবহার করেছেন। আপনি যখন "আমাকে সেটি দাও" বা "এটাকে তাকাও" বলেন, তখন আপনি গ্রামারিক্যাল ভেরিয়েবল ব্যবহার করছেন (আপনি সেগুলো সর্বনাম হিসেবে ভাবেন), কারণ "এই" এবং "সেটি"-র অর্থ নির্ভর করে আপনি মনে কী চিত্র আঁকছেন বা আপনার শ্রোতাদের বুঝাতে আপনি কীতে নির্দেশ করছেন। গাণিতিক সমস্যা সমাধান করার সময় আপনি অজানা মানকে প্রতিনিধিত্ব করার জন্য ভেরিয়েবল ব্যবহার করেন, যদিও আপনি সেটিকে ভেরিয়েবল বলেন না।
এখানে একটি দ্রুত ও সহজ বাশ ভেরিয়েবল ডেমো যা আপনি প্রতিদিন ব্যবহার করেন হলেও সেটি বুঝতে পারেননি। PS1 ভেরিয়েবল আপনার টার্মিনাল প্রম্পট কীভাবে দেখাবে সেটির তথ্য ধারণ করে। উদাহরণস্বরূপ, আপনি এটিকে খুব সহজ কিছুতে—যেমন একটি পারসেন্ট সাইন (%)—রূপান্তর করতে পারেন PS1 ভেরিয়েবলকে পুনর্বিন্যাস করে:
$ PS1="% " %
এই আর্টিকেলটি লিনাক্স, BSD, Mac, বা Cygwin-এ চলমান বাশ শেলের ভেরিয়েবল নিয়ে আলোচনা করে। মাইক্রোসফটের ওপেন সোর্স PowerShell ব্যবহারকারীদের আমার PowerShell ভেরিয়েবল संबंधি আর্টিকেল পড়তে বলা হয়েছে।
ভেরিয়েবলগুলো কিসের জন্য?
আপনার টার্মিনালে কী করছেন সেটি নির্ভর করে বাশে ভেরিয়েবল দরকার কিনা। কিছু ব্যবহারকারীর জন্য ভেরিয়েবল ডেটা ম্যানেজমেন্টের অপরিহার্য сред্ধি, অন্যদের জন্য ছোট ও অস্থায়ী সুবিধা, আবার অন্যদের জন্য সেগুলো অস্তিত্বহীন।
চূড়ান্তভাবে, ভেরিয়েবল একটি টুল। আপনি সেটি ব্যবহার করতে পারেন যখন আপনি এর ব্যবহার খুঁজে পাবেন, অথবা জানতে পারেন যে আপনার OS সেগুলো ম্যানেজ করছে সেটি জানার সান্ত্বনা নিয়ে ছেড়ে দিতে পারেন। কিন্তু জ্ঞানই শক্তি, এবং বাশে ভেরিয়েবল কীভাবে কাজ করে সেটি বুঝলে আপনি নানাবিধ সৃজনশীল সমস্যা সমাধানের পথ খুঁজে পেতে পারেন।
ভেরিয়েবল কীভাবে সেট করবেন
ভেরিয়েবল তৈরি করতে কোনো বিশেষ পারমিশন দরকার নেই। সেগুলো তৈরি করা ফ্রি, ব্যবহার করা ফ্রি, এবং সাধারণত হানিকারক নয়। একটি বাশ শেলে (লিনাক্স এবং ম্যাক-এ), আপনি একটি ভেরিয়েবল নাম ডিফাইন করে এবং তার মান সেট করে ভেরিয়েবল তৈরি করতে পারেন। নিচের উদাহরণে FOO নামে একটি নতুন ভেরিয়েবল তৈরি করা হয়েছে এবং এর মান সেট করা হয়েছে স্ট্রিং /home/seth/Documents:
$ declare FOO="/home/seth/Documents"
সফলতা নীরবে ঘটে, তাই আপনি আত্মবিশ্বাসী হোনা পারেন না যে আপনার ভেরিয়েবল সেট হয়েছে। আপনি echo কমান্ড দিয়ে ফলাফল দেখতে পারেন, ভেরিয়েবলের আগে ডলার সাইন ($) যোগ করে ভেরিয়েবলটি রিকল করুন। ভেরিয়েবলটি আপনি যেমন ডিফাইন করেছেন ঠিক তেমনই পড়া যায় তা নিশ্চিত করতে আপনি ব্রেস ও কোটও ব্যবহার করতে পারেন। এটি ভেরিয়েবলে থাকা যেকোনো স্পেশাল ক্যারেক্টার সংরক্ষণ করে; এই উদাহরণে সেটি প্রযোজ্য নয়, কিন্তু এটা ভালো অভ্যাস তৈরি করবে:
$ echo "${FOO}"
/home/seth/Documents
ভেরিয়েবল সেট করা শেল ব্যবহারকারীদের জন্য সাধারণ বিষয়, তাই প্রক্রিয়াটি কিছুটা অনফরমাল হয়ে গেছে। যখন একটি স্ট্রিংয়ের পরে ইকোয়াল সাইন (=) এবং একটি মান থাকে, বাশ চুপচাপ অনুমান করে যে আপনি একটি ভেরিয়েবল সেট করছেন, ফলে declare কিওয়ার্ড অপ্রয়োজনীয় হয়ে যায়:
$ FOO="/home/seth/Documents"
ভেরিয়েবলগুলো সাধারণত একটি সিস্টেম থেকে অন্য সিস্টেমে তথ্য पहुंचানোর জন্য। এই সাধারণ উদাহরণে আপনার ভেরিয়েবল খুব কাজের নয়, কিন্তু এটিও তথ্য আদান-প্রদান করতে পারে। উদাহরণস্বরূপ, যেহেতু FOO ভেরিয়েবলের কন্টেন্ট একটি ফাইল পথ, আপনি ভেরিয়েবলটি ~/Documents ডিরেক্টরির শর্টকাট হিসেবে ব্যবহার করতে পারেন:
$ pwd
/home/seth
$ cd "${FOO}"
$ pwd
/home/seth/Documents
ভেরিয়েবল হতে পারে যেকোনো নন-রিজার্ভড স্ট্রিং (ইন্টিজার এবং আন্ডারস্কোরসহ)। এগুলো ক্যাপিটালাইজড হতে বাধ্য নয়, কিন্তু সাধারণত ক্যাপিটাল লেটার ব্যবহার করা হয় যাতে সেগুলো সহজে ভেরিয়েবル হিসেবে চিনা যায়।
ভেরিয়েবল কীভাবে ক্লিয়ার করবেন
আপনি unset কমান্ড দিয়ে একটি ভেরিয়েবল ক্লিয়ার করতে পারেন:
$ unset FOO $ echo $FOO
অবাস্তবে, এই অ্যাকশন সাধারণত প্রয়োজন নেই। ভেরিয়েবলগুলোhält "সস্তা", তাই আপনি সেগুলো তৈরি করতে পারেন এবং দরকার না থাকলে ভুলে যেতে পারেন। যাইহোক, এমন সময় হতে পারে যখন আপনি নিশ্চিত করতে চান যে একটি ভেরিয়েবল খালি আছে যাতে অন্য কোনো প্রসেস যেটি পড়তে পারে সেটি ভুল তথ্য না পায়।
সংঘর্ষ সুরক্ষা সহ নতুন ভেরিয়েবল তৈরি করুন
কখনো কখনো আপনার কারণে থাকতে পারে যে একটি ভেরিয়েবল ইতিমধ্যে আপনি বা কোনো প্রসেস দ্বারা সেট করা আছে। আপনি যদি সেটিকে ওভাররাইড করতে না চান, তবে একটি স্পেশাল সিনট্যাক্স আছে যা ভেরিয়েবলকে এর বিদ্যমান মান ধরে রাখতে দেয় যদি সেটি খালি না হয়।
এই উদাহরণের জন্য, অনুমান করুন FOO সেট করা আছে /home/seth/Documents:
$ FOO=${FOO:-"bar"}
$ echo $FOO
/home/seth/Documents
কোলন-ড্যাশ :- নোটেশন declare-কে বিদ্যমান মানকে ডিফল্ট হিসেবে ব্যবহার করতে বাধ্য করে। বিপরীত পথে কাজ করছে কিনা দেখতে, ভেরিয়েবলটি আনসেট করে আবার চেষ্টা করুন:
$ unset FOO
$ echo $FOO
$ FOO=${FOO:-"bar"}
$ echo $FOO
bar
চাইল্ড প্রসেসে ভেরিয়েবল পাস করুন
আপনি যখন একটি ভেরিয়েবল তৈরি করেন, তখন আপনি একটি লোকাল ভেরিয়েবল তৈরি করেন। এর মানে হলো ভেরিয়েবলটি শুধু আপনার কারেন্ট শেল জানে এবং শুধু আপনার কারেন্ট শেল।
এই সেটআপটি ইচ্ছাকৃতভাবে একটি ভেরিয়েবলের স্কোপ সীমাবদ্ধ করে। ডিজাইনের అనুসারে ভেরিয়েবলগুলো ডিফল্টভাবে শুধু লোকালি উপলব্ধ থাকে, যাতে তথ্য শেয়ারিং need-to-know বেসিসে থাকে। উদাহরণস্বরূপ, আপনি যদি ভুলে একটি গুরুত্বপূর্ণ পাসওয়ার্ড ক্লিয়ার টেক্সটে ভেরিয়েবলে রাখেন, তবে জানা ভালো যে আপনার সিস্টেম সেই ভেরিয়েবলকে রিমোট শেল বা রোগ ডিমন (অথবা সেই সেশন ছাড়া অন্য যেকোনো কিছু) অ্যাক্সেস করতে দেবে না।
এই আর্টিকেলের শুরুতে থাকা উদাহরণ ব্যবহার করে আপনার প্রম্পট পরিবর্তন করুন, কিন্তু তারপর আপনার কারেন্ট শেলের ভিতরেই একটি নতুন শেল লঞ্চ করুন:
$ PS1="% " % bash $
আপনি যখন একটি নতুন শেল লঞ্চ করেন, নতুন PS1 মান ডিফল্ট প্রম্পট হয়ে যায় আপনার কাস্টম প্রম্পটের বদলে: একটি চাইল্ড প্রসেস তার প্যারেন্টে সেট করা ভেরিয়েবল ইনহেরিট করে না। আপনি যদি চাইল্ড প্রসেসকে কিল করেন, আপনি প্যারেন্ট শেলে ফিরে যাবেন এবং আপনার কাস্টম PS1 প্রম্পট আবার দেখবেন:
$ exit %
আপনি যদি একটি ভেরিয়েবল চাইল্ড প্রসেসে পাস করতে চান, তবে আপনি কমান্ডের আগে ভেরিয়েবল ডেফিনিশন প্রিপেন্ড করতে পারেন, অথবা ভেরিয়েবলকে চাইল্ড প্রসেসে এক্সপোর্ট করতে পারেন।
ভেরিয়েবল প্রিপেন্ড করা
আপনি কোনো কমান্ড চালানোর আগে যেকোনো সংখ্যক ভেরিয়েবল প্রিপেন্ড করতে পারেন। চাইল্ড প্রসেস ভেরিয়েবলগুলো ব্যবহার করবে কিনা সেটি প্রসেসের ওপর নির্ভর, কিন্তু আপনি ভেরিয়েবলগুলো পাস করতে পারেন যাহাক puertas:
$ FOO=123 bash $ echo $FOO 123 $
প্রিপেন্ডিং একটি উপকারী ট্রিক হতে পারে যখন আপনি একটি অ্যাপ্লিকেশন চালাচ্ছেন যেটি নির্দিষ্ট লাইব্রেরি লোকেশনের জন্য 스페সিয়াল ভেরিয়েবল (যেমন LD_LIBRARY_PATH) চায়, অথবা নন-স্ট্যান্ডার্ড কম্পাইলার (যেমন CC ভেরিয়েবল) দিয়ে সফটওয়্যার কম্পাইল করছেন, ইত্যাদি।
ভেরিয়েবল এক্সপোর্ট করা
একটি ভেরিয়েবলকে চাইল্ড প্রসেসে উপলব্ধ করার আরেকটি উপায় হলো export কিওয়ার্ড, যা বাশে বিল্ট-ইন একটি কমান্ড। export কমান্ড আপনার নির্দিষ্ট ভেরিয়েবল বা ভেরিয়েবলগুলোর স্কোপ বিস্তৃত করে:
$ PS1="% " $ FOO=123 $ export PS1 $ export FOO % bash % echo $PS1 % % echo $FOO 123
উভয় ক্ষেত্রেই, শুধু একটি চাইল্ড শেলই নয়, সেই শেলের যেকোনো চাইল্ড প্রসেস লোকাল ভেরিয়েবল অ্যাক্সেস করতে পারবে যেটি পাস বা এক্সপোর্ট করা হয়েছে। আপনি একই শেল থেকে একটি অ্যাপ্লিকেশন লঞ্চ করতে পারেন, এবং সেই ভেরিয়েবলটি অ্যাপ্লিকেশনের ভিতর থেকে এনভায়রনমেন্ট ভেরিয়েবল হিসেবে উপলব্ধ থাকবে।
সিস্টেমের সব কিছুর জন্য এক্সপোর্ট করা ভেরিয়েবলগুলোকে এনভায়রনমেন্ট ভেরিয়েবল বলা হয়, যা ভবিষ্যতের একটি আর্টিকেলের বিষয়। মাঝপথে, দৈনন্দিন কাজে কিছু ভেরিয়েবল ব্যবহার করে দেখুন সেগুলো আপনার ওয়ার্কফ্লোতে কী আনে।