এই আর্টিকেলে লিনাক্সে ব্যাশ/শেলে printf কমান্ড ব্যবহারের কিছু প্র্যাকটিক্যাল উদাহরণ দেখানো হবে।
printf কমান্ড echo কমান্ডের মতো টেক্সট আউটপুট করে — কিন্তু আউটপুট ফরম্যাটিং-এ আরও বেশি কন্ট্রোল দেয়।
এটি আপনার নিজস্ব ফরম্যাটেড টেক্সট আউটপুট জেনারেট করার জন্য একটি দরকারী টুল — বিশেষ করে যদি আপনাকে টেক্সটে ভেরিয়েবল এম্বেড করতে হয়, নিউলাইন যোগ করতে হয়, টেক্সট এলাইন ও ফরম্যাট করতে হয়, এবং কনভার্টেড ভ্যালু ডিসপ্লে করতে হয়।
printf সিনট্যাক্স
printf কমান্ডের সিনট্যাক্স নিচের মতো:
printf [-v var] format [arguments]...
লক্ষ্য করুন:
- -v অপশন printf-কে বলে রেজাল্ট প্রিন্ট করার বদলে var ভেরিয়েবলে স্টোর করতে
- format হল একটি স্ট্রিং যাতে নিচের তিনটি টাইপের ভ্যালু থাকে:
- নরম্যাল ক্যারেক্টার যা যেনকটা প্রিন্ট হবে
- ব্যাকস্ল্যাশ-এস্কেপড ক্যারেক্টার যা প্রিন্টের আগে ইন্টারপ্রেট হবে
- কনভারশন যা স্পেসিফাইড থাকবে এবং রেসপেক্টিভ আর্গুমেন্ট দিয়ে রিপ্লেস হবে (এগুলো ভেরিয়েবলের মতো চিন্তা করুন)
- arguments format-এ পাস হবে এবং ডিফাইন করা কনভারশনে ব্যবহার হবে
- যদি format-এ কনভারশন স্পেসিফায়ারের চেয়ে বেশি আর্গুমেন্ট থাকে, তবে সকল আর্গুমেন্ট ব্যবহার না হওয়া পর্যন্ত format স্ট্রিং রিপিট হবে
- যদি কম আর্গুমেন্ট থাকে, তবে নмериক স্পেসিফায়ারগুলো শূন্য এবং স্ট্রিং স্পেসিফায়ারগুলো নাল হবে
printf এস্কেপড ক্যারেক্টার, কনভারশন, এবং ফ্ল্যাগস
printf-এ অপশন হিসেবে পাস করার জন্য অপ্রতিহত সংগ্রহ আছে যা টেক্সট ফরম্যাট করার জন্য। নিচের উদাহরণগুলো কিছু প্র্যাকটিক্যাল অ্যাপ্লিকেশন দেখাবে।
এখানে printf কমান্ডের সব অপশন লিস্ট করার বদলে, আপনার সিস্টেমে পূর্ণ ইউজার ম্যানুয়াল দেখতে চালান:
man printf
printf ব্যাশ/শেল উদাহরণ
সঠিক, আखিরে এটা কী কাজে আসে?
নাম্বারের রাউন্ডেড ভ্যালু ডিসপ্লে করা
প্রথমে একটি সিম্পল সিনেরিও — আপনি একটি নাম্বারকে দুটি দশমিক স্থানে ফরম্যাট করে ডিসপ্লে করতে চান:
printf "%.2f" 4.21423557
এটি আউটপুট দেবে:
4.21
স্পেসিফাইড ফরম্যাট %.2f printf-কে বলে নাম্বারকে দুটি দশমিক স্থানে ফরম্যাট করতে। এটি precision ডিরেক্টিভ দিয়ে করা হয়, যা ফরম্যাটে . (পিরিয়ড)।
এটি নাম্বারকে রাউন্ড করে, নির্দিষ্ট দশমিক স্থানে ট্রাঙ্কেট করে না। ফ্লোটিং-পয়েন্ট নাম্বার রাউন্ডিং অদ্ভুত — তাই আউটপুট চেক করুন!
রাউন্ডিং এর অদ্ভুত আচরণ
এই অদ্ভুত আচরণ বোঝाने জন্য নিচের উদাহরণ দেখুন:
printf "%.2f" 4.215
এটা 4.22 হওয়া উচিত, ঠিক না? ভুল। zsh-র printf ইমপ্লিমেন্টেশনে এটি রাউন্ড হবে:
4.21
নাম্বারটি আসলে রাউন্ড হচ্ছে কিনা কনফার্ম করতে অন্য ভ্যালু চেক করুন:
printf "%.2f" 4.216
যা রিটার্ন করবে:
4.22
… অর্থাৎ printf-এ পাস করা নাম্বার রাউন্ড হচ্ছে।
তাহলে 4.215-এর রাউন্ডেড ভ্যালু কেন ভুল দেখাচ্ছে? সহজ কথায়, যেহেতু এটি একটি ফ্লোটিং-পয়েন্ট নাম্বার, ডিসপ্লে হওয়া ভ্যালু এবং কম্পিউটার ক্যালকুলেশনে ব্যবহৃত ভ্যালুর মধ্যে পার্থক্য থাকতে পারে।
এটি এড়ানোর উপায় আছে, কিন্তু এই আর্টিকেলের স্কোপ বাইরে — অন্য আর্টিকেলে কভার করব।
ভ্যালু কনভার্ট করা (ডেসিম্যাল, হেক্সাডেসিম্যাল, অক্টাল)
একটি সাধারণ সিনেরিও — আপনি কিছু নাম্বার অন্য ফরম্যাটে ডিসপ্লে করতে চান যা অন্য প্রোগ্রাম বা স্ক্রিপ্ট থেকে আপনি পেয়েছেন। printf তার কনভারশন স্পেসিফিকেশন সিনট্যাক্স দিয়ে এটি করতে পারে:
printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64
এটি আউটপুট দেবে:
Decimal: 64 Hexadecimal: 40 Octal: 100
64 নাম্বারটি ফরম্যাটারে ৩ বার পাস করা হয়েছে এবং তিনটি ভিন্ন ফরম্যাটে ডিসপ্লে হয়েছে।
সুন্দর আউটপুট তৈরি করা
নিচের উদাহরণে printf ব্যবহার করে একটি ফরম্যাটেড টেবিল আউটপুট করা হয়েছে — কমেন্টে ব্যাখ্যা করা হয়েছে যাতে বুঝা যায় কী হচ্ছে:
#/bin/bash # Define the format for the header text # This is a new line (\n) followed by a left-aligned string of 15 characters (%-15s), followed by a string of 15 characters (%15s), finally followed by a string of 10 characters (%10s) and another newline header_format="\n %-15s %15s %10s\n" # Define the format for the data in each row # The first two entries mirror those in the header, but the final one is a bit different - a floating number with 2 decimal places(%11.2f) row_format=" %-15s %15s %11.2f\n" # Use the printf command to print the header # The format is specified, and the arguments containing the column names for the table are supplied # printf will take the header_format, and insert the values from the attributes into it, formatted to the given specification, then print it printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED" # Print the horizontal line under the table header # Here, printf is used to print an equals symbol. Brace expansion (the curly braces) is a shell scripting shortcut which will run the printf command for every number between 1 and 50, repeating the symbol 50 times to create a line printf '=%.0s' {1..50} # Print each row of data using the row_format. Each line (indicated by a backslash and a line return) contains three values - the car brand, colour, and top speed # Any value with a space needs to be quoted as values are separated by spaces and printf won't be able to tell where one value ends and another begins printf "$row_format" \ Toyota Blue 100 \ Ford "Light Green" 78.3875 \ "General Motors" Purple 15.96
এই স্ক্রিপ্ট চালালে আউটপুট হবে:
CAR BRAND COLOUR TOP SPEED ================================================== Toyota Blue 100.00 Ford Light Green 78.39 General Motors Purple 15.96
printf এখানে কীভাবে ডেটা ফরম্যাট করেছে সেটি ध्यान দিয়ে দেখুন। যেখানে হেডার এবং রোয়ের জন্য নির্দিষ্ট ক্যারেক্টার লেন্থের স্ট্রিং স্পেসিফাই করা হয়েছে, সেখানে টেক্সট এলাইন হয়েছে। টপ স্পিডগুলো দুটি দশমিক স্থানে ফরম্যাট হয়ে সঠিক পজিশনে থাকছে। টেক্সট রাইট-এলাইনড ছাড়া প্রথম কলাম যা লেফ্ট-এলাইনড করা হয়েছে।
অল্প সিনট্যাক্স দিয়ে কঠিন পড়া ডেটা ব্যবহারযোগ্য ইনফরমেশনে রূপান্তরিত হয়েছে।
আকাশই সীমা
আপনি printf ব্যবহারের নিজস্ব কারণ খুঁজে পাবেন — স্ক্রিপ্টের জন্য প্রিটি মেনু সহ কমান্ড-লাইন ইন্টারফেস বানানো, ডেটাবেস কোয়েরির ফলাফল ট্যাবুলেট করা — এটি আপনার ব্যাগে একটি পাওয়ারফুল টুল, বিশেষ করে যদি আপনি অনাকে একটি স্লিক-লুকিং শেল স্ক্রিপ্ট দিয়ে ইমপ্রেস করতে চান অনফরম্যাটেড টেক্সট ডাম্প করার বদলে।
আপনি printf-কে লিনাক্সের অন্যান্য টেক্সট হ্যান্ডলিং কমান্ডের সাথে কম্বাইন করতে পারেন।