আপনি যদি কখনো কোড লিখেছেন, চায়ে সেটি একটি শেল স্ক্রিপ্ট, একটি পাইথন স্ক্রিপ্ট, C++, অথবা এমনকি Scratch, তবে আপনি জানেন যে ভেরিয়েবলগুলো জরুরি। কম্পিউটার এবং কোডাররা ভেরিয়েবলগুলোকে ওয়ে-স্টেশন হিসেবে ব্যবহার করে, যেখানে তারা গোপনে ইনফরমেশন ফিরিয়ে আনেন। উদাহরণস্বরূপ, আপনি যদি একটি শেল স্ক্রিপ্টে একজন ব্যবহারকারীর নাম প্রসেস করতে চান, আপনি একটি ভেরিয়েবল সেট আপ করতে পারেন, ভেরিয়েবলে ইউজারনেম রাখতে পারেন, এবং তারপর কম্পিউটারকে বলতে পারেন ভেরিয়েবলটির সাথে কিছু করতে (অথরাইজড ইউজারদের তালিকা সহ চেক করার জন্য, উদাহরণস্বরূপ)। ভেরিয়েবলগুলো গুরুত্বপূর্ণ কারণ এগুলো কোডকে ডাইনামিক করে তোলে: এগুলো ইনফরমেশনের জন্য প্লেসহোল্ডার যা প্রতিবার কোড রান করলে পরিবর্তন হওয়ার আশা করা হয়।
কিন্তু ভেরিয়েবলগুলো, কারণ এগুলো খুব সাধারণ, কখনো কখনো বাধ্যবাধক হয়ে যেতে পারে। অনেক সময়, আপনি একটি কোড প্রজেক্টে এতগুলো ভেরিয়েবল জমা করেন যে সেগুলো সব ট্র্যাক রাখা প্রায় অসম্ভব হয়ে যায়। আপনি চতুর কনভেনশন ব্যবহার করতে পারেন, যেমন সব রিলেটেড ভেরিয়েবলকে একটি কমন স্ট্রিং দিয়ে প্রিফিক্স করা (user_name, user_pass, user_time, ইত্যাদি), অথবা আপনি সেগুলোর একটি মাস্টার লিস্ট কোথাও তৈরি করতে পারেন সহজ রেফারেন্সের জন্য, তবে সব ট্র্যাক রাখার ওভারহেড বাধ্যবাধক হতে পারে।
এই সমস্যার একটি উত্তর, ঐতিহ্যবাহিকভাবে, অ্যারে। এগুলো বেশির ভাগ কোডিং ভাষায়, শেল স্ক্রিপ্টিং ভাষা সহ ব্যাশের মতো ভালো কাজ করেছে।
বেশির ভাগ শেল ইনডেক্সড অ্যারে তৈরি, ম্যানিপুলেট, এবং কোয়েরি করার ক্ষমতা অফার করে। সাদা ইংরেজিতে, একটি ইনডেক্সড অ্যারে হলো একটি জিনিসের তালিকা যেগুলো একটি নম্বর দিয়ে প্রিফিক্সড। জিনিসগুলোর এই তালিকা, তাদের বরাদ্দ করা নম্বরের সাথে, সুবিধাজনকভাবে একটি একক ভেরিয়েবলে র্যাপ করা থাকে, যা আপনার কোডে এটিকে "হাতে ধরে" ঘুরানো সহজ করে তোলে।
ব্যাশ, যাইহোক, অ্যাসোসিয়েটিভ অ্যারে তৈরি করার ক্ষমতা অন্তর্ভুক্ত করে, এবং এটি এই অ্যারে들을 অন্য যেকোনো অ্যারের মতোই বিবেচনা করে। একটি অ্যাসোসিয়েটিভ অ্যারে আপনাকে কী এবং ভ্যালু পেয়ারের তালিকা তৈরি করতে দেয়, শুধু নম্বরযুক্ত ভ্যালু না।
আপনি আrbitrary কীতে ভ্যালু এসাইন করতে পারেন:
$ declare -A userdata
$ userdata[name]=seth
$ userdata[pass]=8eab07eb620533b083f241ec4e6b9724
$ userdata[login]=`date --utc +%s`
যেকোনো কী কোয়েরি করুন:
$ echo "${userdata[name]}"
seth
$ echo "${userdata[login]}"
1583362192
আপনি যে সাধারণ অ্যারে অপারেশনগুলো আশা করবেন সেগুলো অধিকাংশ উপলব্ধ। উদাহরণস্বরূপ, আপনি সব ভ্যালু তালিকাভুক্ত করতে পারেন:
$ echo "${userdata[*]}"
8eab07eb620533b083f241ec4e6b9724 seth 1583362192
আপনি পুরো অ্যারে দেখতে পারেন:
$ typeset -A
declare -A BASH_ALIASES='()'
declare -A BASH_CMDS='()'
declare -A userdata='([pass]="8eab07eb620533b083f241ec4e6b9724"
[name]="seth"
[login]="1583362192" )'
আপনি আপনার অ্যারে থেকে আইটেমগুলো unset কমান্ড ব্যবহার করে সরাতে পারেন:
$ unset userdata[pass]
$ typeset -A
[...]
declare -A userdata='([name]="seth"
[login]="1583362192" )'
অবশেষে, আপনি পুরো অ্যারে ডিসমিস করতে পারেন।
$ unset "userdata[*]"
ডেটার জন্য অ্যারে
অ্যারে রিলেটেড ডেটা একসাথে সংরক্ষণের জন্য উপযোগী টুল। আপনি অধিকাংশ কেসে একটি পুরনো ভেরিয়েবল ব্যবহার করতে পারেন, কিন্তু কখনো কখনো এটি বেশি লজিক্যাল যে একটি সিঙ্গুলার ডেটা "অবজেক্ট"-এর অ্যাট্রিবিউটগুলো একটি অ্যারেতে সংরক্ষণ করা, ডেটা কনসোলিডেটেড এবং ইনডেক্সড রাখতে। উদাহরণস্বরূপ, আপনি যদি utmp- থেকে লগইন নাম এবং সময় প্রসেস করেন, এটি আপনার জন্য আরও উপযোগী হবে লগইন টাইমকে সেই ইউজারের সাথে অ্যাসোসিয়েট করা যার দিকে টাইমটি রেফার করে, বরং শুধু দুটি ডেটা অবজেক্টকে আলাদা ভেরিয়েবল হিসেবে সংরক্ষণ করা যাদের মধ্যে কোনো স্পষ্ট সংযোগ নেই।
অতিরিক্তভাবে, ভেরিয়েবলদের ভিন্ন, একটি অ্যারেতে একটি এন্ট্রি অস্তিত্বে থাকতে হয় না আপনি সেটিতে ডেটা সংরক্ষণ করার আগে। আপনাকে আগে থেকে জানতে হয় না কতটুকু ডেটা সংরক্ষিত হবে। এটা বড় সুবিধা হতে পারে আপনি যেসব ডেটা প্রসেস করছেন সেগুলো আপনি কন্ট্রোল বা প্রেডিক্ট করতে পারছেন না: আপনি যদি না জানেন utmp-এ একদিন থেকে অন্য দিনে কত ইউজার এক্সপেক্ট করবেন, একটি স্ক্রিপ্ট বিল্ড করা কঠিন যা সকল এন্ট্রি ধারণ করবে। কিন্তু একটি অ্যারেতে, আপনাকে শুধু একটি অ্যারে ডিক্লেয়ার করতে হবে এবং ডেটা সেটিতে পড়াতে হবে, নতুন কী এবং ভ্যালু পেয়ার তৈরি করতে হবে যতক্ষণ না আপনার ইনজেস্ট করার ডেটা শেষ হয়।
অ্যারে শক্তিশালী, এবং সেগুলো ব্যাশের বাইরেও প্রোগ্রামিং ভাষায় সাধারণ। এখন থেকে সেগুলো ব্যবহার করা শুরু করুন!