লিনাক্স শেল স্ক্রিপ্টিং ল্যাঙ্গুয়েজ সবসময় একটি হট টপিক এবং ভবিষ্যতেও থাকবে। শেল স্ক্রিপ্টিং ল্যাঙ্গুয়েজ ম্যাজিক্যাল এবং যেকোনো অন্য ল্যাঙ্গুয়েজের মতো স্ক্রিপ্টিং ল্যাঙ্গুয়েজে প্রোগ্রাম করা খুব সহজ। তবে, এটি চায় আমরা যা করছি এবং ফলাফল কী আশা করা হচ্ছে সেটির একটি গভীর জ্ঞান।
আমরা আমাদের পাঠকদের জন্য যে সব শেল স্ক্রিপ্টিং আর্টিকেল লিখেছি সেগুলো অত্যন্ত প্রশংসিত হয়েছে যার মধ্যে শেষটি "লিনাক্স ভেরিয়েবলের অন্তর্দৃষ্টি"। আমরা শেষ আর্টিকেলটিকে একটি নতুন লেভেলে প্রসারিত করছি।
ভেরিয়েবল অ্যাট্রিবিউট
লিনাক্স এনভায়রনমেন্টে প্রতিটি ভেরিয়েবলের কিছু অপশন থাকে, এবং সেগুলোকে 'অ্যাট্রিবিউট' বলা হয়। এই অপশন বা অ্যাট্রিবিউটগুলো পরিস্থিতির মতে On এবং Off করা যায় "declare" কমান্ড ব্যবহার করে।
ভেরিয়েবল অ্যাট্রিবিউটের একটি উদাহরণ হলো একটি সুইচ ব্যবহার করা যেন '-i' যা সংশ্লিষ্ট ভেরিয়েবলের জন্য ইন্টিজার অ্যাট্রিবিউট অন করবে। এমনকি যদি একটি নন-নিউমেরিক মান পাস করা হয় '-i' সুইচে, এটি কোনো এরর মেসেজ থ্রো করবে না এবং আউটপুট '0' দেবে ইন্টিজার ইন্টারপ্রিটেশন হিসেবে। এখান থেকে এটি আরো স্পষ্ট হবে নিচের উদাহরণ থেকে।
একটি ইন্টিজার ভেরিয়েবল ডিক্লেয়ার করুন, bill = 121
admin@wsxdn.com:~$ declare -i bill=121
ভেরিয়েবল bill-এর মান printf করুন।
admin@wsxdn.com:~$ printf "%d\n" "$bill" 121
ভেরিয়েবলের মান একটি স্ট্রিং হোক। bill ভেরিয়েবলটি ইতিমধ্যে ডিক্লেয়ার করা, দ্বিতীয়বার ডিক্লেয়ার করার দরকার নেই। শুধু ভেরিয়েবলের মান পরিবর্তন করুন।
admin@wsxdn.com:~$ bill=tecmint
এখন, আবার ভেরিয়েবল bill-এর মান printf করুন।
admin@wsxdn.com:~$ printf "%d\n" "$bill" 0
'0' লক্ষ্য করুন এরর মেসেজের জায়গায়।
এখন, প্রশ্ন হলো, ইতিমধ্যে ডিক্লেয়ার করা ভেরিয়েবলগুলোর অ্যাট্রিবিউট কীভাবে জানব?
admin@wsxdn.com:~$ declare -p bill declare -i bill="121"
এখানে, একটি -p (স্ট্যান্ডস ফর প্রিন্ট) সুইচ সাহায্য করে।
আরেকবার, একটি ভেরিয়েবলের অ্যাট্রিবিউট অফ করার জন্য আমি কী করব?
একটি ভেরিয়েবলের অ্যাট্রিবিউট Off করার জন্য আমাদের যা দরকার সেটি হলো সুইচের ঠিক আগে একটি + (প্লাস) সাইন রাখা। এখান থেকে এটি আরো স্পষ্ট হবে নিচের উদাহরণ থেকে।
উপরের ভেরিয়েবলের ইন্টিজার অ্যাট্রিবিউট Off করুন।
admin@wsxdn.com:~$ declare +i bill
ভেরিয়েবলের মান চেক করুন।
admin@wsxdn.com:~$ printf "%d\n" "$bill" bash: printf: bill: invalid number 0
এখন স্ট্রিং সুইচ ব্যবহার করে ভেরিয়েবলের মান প্রিন্ট করুন।
admin@wsxdn.com:~$ printf "%s\n" "$bill" tecmint
উপরের উদাহরণে, bash নন-নিউমেরিক মানকে এরর হিসেবে জাজ করতে পারলো না, তবে printf ইন্টারপ্রেট করছে, কী একটি নম্বর হতে পারে এবং কী নাও হতে পারে।
রিড-অনলি ভেরিয়েবল
আপনি শاید শুনেছেন রিড অনلی মেমরি (ROM), কিন্তু রিড-অনলি ভেরিয়েবল কী? এর ROM-এর সাথে কোনো সাদৃশ্য আছে?
ভালো, রিড-অনলি ভেরিয়েবল রিড-অনলি মেমরির মতো একবার অ্যাসাইন হলে এর মান পরিবর্তন করা যায় না। তাই এটিকে রিড-অনলি বলা হয়। আপনি সেটির জন্য নতুন মান লিখতে, এডিট বা মডিফাই করতে পারবেন না। এখানে একটি উদাহরণ দিয়ে ইলাস্ট্রেশন।
রিড অনলি (-r) ভেরিয়েবল name ডিক্লেয়ার করুন যার মান "Tecmint.com"।
admin@wsxdn.com:~$ declare -r name="Tecmint.com"
উপরে ডিক্লেয়ার করা ভেরিয়েবলের মান printf করুন।
admin@wsxdn.com:~$ printf "%s\n" "$name" Tecmint.com
ভেরিয়েবলের মান পরিবর্তন করার চেষ্টা করুন।
admin@wsxdn.com:~$ declare -r name="Avishek" bash: declare: name: readonly variable
উপরে আলোচনাকৃতভাবে একটি রিড-অনলি ভেরিয়েবলের অ্যাট্রিবিউট '+' সাইন ব্যবহার করে পরিবর্তন করা যায়।
লিনাক্সে ভেরিয়েবল এক্সপোর্ট করা
একটি শেল স্ক্রিপ্টে ডিক্লেয়ার করা সব শেল ভেরিয়েবল স্ক্রিপ্ট চলার পর্যন্ত উপলব্ধ থাকে। স্ক্রিপ্টের বাইরে স্ক্রিপ্ট থেকে ভেরিয়েবল অস্তিত্বে নেই। স্ক্রিপ্টের বাইরে ভেরিয়েবল উপলব্ধ করার প্রক্রিয়াকে ভেরিয়েবল এক্সপোর্ট করা বলা হয়।
একটি ভেরিয়েবল শেলের বাইরে এক্সপোর্ট করা যায় সুইচ declare -x (export) ব্যবহার করে, যা শেলকে স্বীকৃতি দেয় আপনি কী এক্সপোর্ট করতে চান। একটি ডিক্লেয়ার এক্সপোর্ট সুইচ ব্যবহার করা যেতে পারে।
admin@wsxdn.com:~$ declare -x variable="Constant_Value"
স্ক্রিপ্ট চলার সময় ভেরিয়েবলে করা সব পরিবর্তন, ভেরিয়েবল এক্সপোর্ট হলে স্ক্রিপ্টের বাইরে যাওয়ার সময় হারিয়ে যায়। শেল স্ক্রিপ্টিং-এ ভেরিয়েবল এক্সপোর্ট করা খুব গুরুত্বপূর্ণ।
আমরা একটি ভেরিয়েবল চাই যেটি রিড-অনলি হবে এবং স্ক্রিপ্টের বাইরে উপলব্ধ, আমাদের সুইচ -r এবং সুইচ -x একসাথে ব্যবহার করতে হবে।
admin@wsxdn.com:~$ declare -rx variable="Constant_Value"
এনভায়রনমেন্ট ভেরিয়েবল
ভেরিয়েবলগুলো যা প্রোগ্রাম এবং সেগুলো এক্সিকিউট করার প্রোগ্রামের মধ্যে শেয়ার করা হয়। এনভায়রনমেন্ট ভেরিয়েবল এক্সপোর্ট করা যায় কিন্তু অ্যাট্রিবিউট অ্যাসাইন করা যায় না।
উপরের থিওরি প্র্যাক্টিক্যালি বুঝি। এখানে আমাদের দুটি স্ক্রিপ্ট রয়েছে 0.sh এবং 1.sh।
# 0.sh #!/bin/bash declare -rx name=Tecmint bash 0.sh exit 0
এবং দ্বিতীয় স্ক্রিপ্টটি হলো।
# 1.sh #!/bin/bash printf "%s\n" "$name" name=Tecmint.com printf "%s\n" "$name" exit 0
এখানে কী হচ্ছে, একটি ভেরিয়েবল (name) রিড অনলি এবং এক্সপোর্টেড হিসেবে ডিক্লেয়ার করা হয়েছে এবং ততক্ষণায় দ্বিতীয় স্ক্রিপ্ট কল করা হয়েছে।
দ্বিতীয় স্ক্রিপ্টটি শুধু প্রথম স্ক্রিপ্ট থেকে এক্সপোর্ট করা ভেরিয়েবলটি প্রথম printf স্টেটমেন্টে প্রিন্ট করল। দ্বিতীয় printf স্টেটমেন্টে এटी ভেরিয়েবল 'name'-এ অ্যাসাইন করা নতুন মান দেখাচ্ছে।
চিন্তা করতে হবে না, যে ভেরিয়েবলটি রিড-অনলি ছিল, কীভাবে এটি রি-অ্যাসাইন করা যায়। আপনি কি ভুলে গেছেন যে "স্ক্রিপ্ট চলার সময় ভেরিয়েবলে করা সব পরিবর্তন, ভেরিয়েবল এক্সপোর্ট হলে স্ক্রিপ্টের বাইরে যাওয়ার সময় হারিয়ে যায়।"
রেফারেন্স
declare কমান্ড নিচের সব সুইচ এবং তাদের কম্বিনেশন অনুমতি দেয়।
- -a : একটি অ্যারে ডিক্লেয়ার করে।
- -f : ফাংশন এবং ডেফিনিশন ডিসপ্লে করে।
- -F : ফাংশন নাম ডিসপ্লে করে।
- -r : ভেরিয়েবলকে রিড-অনলি হিসেবে ডিক্লেয়ার করে।
- -x : ভেরিয়েবলকে এক্সপোর্টেবল হিসেবে ডিক্লেয়ার করে।
- -I : ভেরিয়েবলকে ইন্টিজার হিসেবে ডিক্লেয়ার করে।
আজ এপর্যন্ত। খুব শীঘ্রই আমরা ভেরিয়েবল সাবস্টিটিউট করার উপায় 'eval' কমান্ড ব্যবহার করে এবং বন্ধ করার আগে বাশে ইতিমধ্যে ডিফাইন করা ভেরিয়েবল নিয়ে আলোচনা করব পরবর্তী আর্টিকেলে। আশা করি আপনারা স্ক্রিপ্টিং-র গভীরে যাওয়ার যাত্রা উপভোগ করছেন। তখন পর্যন্ত টিউন্ড এবং কানেক্টেড থাকুন Tecmint.com-এর সাথে।