আপনি বাহ্যিক ইউটিলিটিগুলিতে কল করতে পারেন (অন্যান্য উত্তর দেখুন), তবে তারা আপনার স্ক্রিপ্টটি ধীর করে দেবে এবং নদীর গভীরতানির্ণয়টি সঠিকভাবে পাওয়া শক্ত।
Zsh
Zsh এ, আপনি ${#$(readlink -f /etc/fstab)}
কমান্ড প্রতিস্থাপনের দৈর্ঘ্য পেতে লিখতে পারেন । লক্ষ্য করুন যে এটি কমান্ড আউটপুটটির দৈর্ঘ্য নয়, এটি কোনও পূর্ববর্তী নিউলাইন ছাড়াই আউটপুটটির দৈর্ঘ্য।
আপনি যদি আউটপুটটির সঠিক দৈর্ঘ্য চান তবে শেষে একটি অতিরিক্ত নন-লাইন অক্ষর আউটপুট করুন এবং একটিটি বিয়োগ করুন।
$((${#$(readlink -f /etc/fstab; echo .)} - 1))
আপনি যা চান তা কমান্ডের আউটপুটে পে-লোড হয়, তবে আপনাকে এখানে দুটি বিয়োগ করতে হবে , কারণ আউটপুটটি readlink -f
হ'ল ক্যানোনিকাল পাথ এবং একটি নতুন লাইন।
$((${#$(readlink -f /etc/fstab; echo .)} - 2))
এটি ${#$(readlink -f /etc/fstab)}
বিরল তবে সম্ভাব্য ক্ষেত্রে থেকে আলাদা যেখানে প্রামাণিক পথটি একটি নতুন লাইনে শেষ হয়।
এই নির্দিষ্ট উদাহরণের জন্য, আপনার কোনও বাহ্যিক ইউটিলিটি দরকার নেই, কারণ zsh এর একটি বিল্ট-ইন কন্সট্রাক্ট রয়েছে যা readlink -f
ইতিহাস সংশোধকটির মাধ্যমে সমতুল্য A
।
echo /etc/fstab(:A)
দৈর্ঘ্য পেতে, প্যারামিটার প্রসারণে ইতিহাসের সংশোধক ব্যবহার করুন:
${#${:-/etc/fstab}:A}
আপনার যদি ভেরিয়েবলের ফাইলের নাম থাকে তবে filename
তা হবে ${#filename:A}
।
বোর্ন / পসিক্স-স্টাইল শেল
খাঁটি বোর্ন / পসিক্স শেলগুলির কোনওটিই (বোর্ন, অ্যাশ, ম্যাক্স, ksh93, বাশ, যশ ...) এর সাথে আমার পরিচিত কোনও মিল নেই। আপনার যদি কমান্ড প্রতিস্থাপনের আউটপুটে বা নীড় প্যারামিটার বিকল্পগুলির জন্য প্যারামিটার বিকল্প প্রয়োগ করতে হয় তবে ধারাবাহিক পর্যায়ে ব্যবহার করুন।
আপনি যদি চান তবে একটি প্রক্রিয়াতে প্রসেসিং স্টাফ করতে পারেন।
command_output_length_sans_trailing_newlines () {
set -- "$("$@")"
echo "${#1}"
}
অথবা
command_output_length () {
set -- "$("$@"; echo .)"
echo "$((${#1} - 1))"
}
তবে সাধারণত কোনও লাভ নেই; ksh93 ব্যতীত, এর ফলে অতিরিক্ত কাঁটাচামচ ফাংশনের আউটপুট ব্যবহার করতে সক্ষম করে, সুতরাং এটি আপনার স্ক্রিপ্টটিকে ধীর করে তোলে এবং খুব সহজেই কোনও পাঠযোগ্যতার সুবিধা রয়েছে।
আবার, এর আউটপুট readlink -f
হ'ল ক্যানোনিকাল পাথ প্লাস একটি নতুন লাইন; আপনি যদি ক্যানোনিকাল পাথের দৈর্ঘ্য চান তবে 1 ইন এর পরিবর্তে 2 বিয়োগ করুন command_output_length
। command_output_length_sans_trailing_newlines
ক্যানোনিকাল পথটি কোনও নতুন লাইনে শেষ না হলেই ব্যবহার সঠিক ফলাফল দেয়।
বাইটস বনাম অক্ষর
${#…}
বাইটে নয়, অক্ষরগুলির দৈর্ঘ্য বলে মনে করা হয় যা মাল্টিবাইট লোকালগুলিতে পার্থক্য করে। যুক্তিসঙ্গতভাবে ksh93, বাশ এবং zsh এর আপ-টু-ডেট সংস্করণগুলি নির্মাণের সময় বাড়ানোর LC_CTYPE
সময় অনুযায়ী মান অনুসারে দৈর্ঘ্যের দৈর্ঘ্য গণনা করে ${#…}
। অন্যান্য অনেকগুলি সাধারণ শেল সত্যিকার অর্থে মাল্টিবাইট লোকেলগুলি সমর্থন করে না: ড্যাশ 0.5.7, ম্যাক্স 46 এবং পশ 0.12.3 হিসাবে, ${#…}
দৈর্ঘ্য বাইটে দেয়। আপনি যদি নির্ভরযোগ্য উপায়ে অক্ষরগুলির দৈর্ঘ্য চান তবে wc
ইউটিলিটিটি ব্যবহার করুন :
$(readlink -f /etc/fstab | wc -m)
$LC_CTYPE
কোনও বৈধ লোকেল হিসাবে নির্ধারিত হওয়া পর্যন্ত আপনি আত্মবিশ্বাসের সাথে বিশ্বাস রাখতে পারেন যে এটির ফলে ভুল হয় (এমন কোনও প্রাচীন বা সীমাবদ্ধ প্ল্যাটফর্ম যা মাল্টবাইট লোকেলগুলি সমর্থন করে না) বা অক্ষরগুলির মধ্যে সঠিক দৈর্ঘ্য ফিরিয়ে দেবে। (ইউনিকোডের জন্য, "অক্ষরের দৈর্ঘ্য" মানে কোড পয়েন্টের সংখ্যা - অক্ষরগুলির সংমিশ্রণের মতো জটিলতার কারণে গ্লাইফগুলির সংখ্যা আরও একটি গল্প)
আপনি যদি দৈর্ঘ্য বাইটে চান, LC_CTYPE=C
অস্থায়ীভাবে সেট করুন বা এর wc -c
পরিবর্তে ব্যবহার করুন wc -m
।
বাইট বা অক্ষর সহ গণনা wc
করাতে কমান্ড থেকে আসা কোনও নতুন লাইনের অন্তর্ভুক্ত রয়েছে। আপনি যদি বাইটগুলিতে ক্যানোনিকাল পাথের দৈর্ঘ্য চান তবে এটি
$(($(readlink -f /etc/fstab | wc -c) - 1))
এটি অক্ষরে পেতে, 2 বিয়োগ করুন।
readlink -f /etc/fstab
হয় 11 টি অক্ষর। নতুন লাইনটি ভুলে যাবেন না। অন্যথায় আপনি/etc/fstabluser@cern:~$
যখন এটি শেল থেকে দৌড়েছিলেন তখন আপনি দেখতে পাবেন ।