একটি ভেরিয়েবলের দৈর্ঘ্য যাচাই করুন


27

আমি পরিবর্তনশীল পড়ার দৈর্ঘ্য যাচাই করতে পেরেছি (আমার স্ক্রিপ্ট সন্নিবেশিত পাঁচটি অক্ষরের সীমাতে), আমি এরকম কিছু সম্পর্কে চিন্তা করি:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

আরও একটি "মার্জিত" সমাধান আছে?


1
আপনার স্ক্রিপ্ট স্ট্যান্ডার্ড POSIX এ সঠিকভাবে কাজ করে /bin/sh। আপনার কাছে শেবাং লাইনটি পরিবর্তনের বিষয়টি বিবেচনা করা উচিত #!/bin/shযাতে এটি আরও পোর্টেবল হয়ে যায় এবং যেখানে পরিবেশ পাওয়া যায় না এমন পরিবেশে চালিত হয়। এছাড়াও, /bin/shড্যাশের মতো আরও হালকা ওজনের শেল হতে পারে যা ইন্টারেক্টিভ ব্যবহারের জন্য বোঝানো বৈশিষ্ট্যগুলিতে বোঝা হয় না।
সেলেদা

@Celada এই ক্ষেত্রে সত্য যদিও, dashএর ${#string}আপনি অক্ষর পরিবর্তে বাইটের সংখ্যা দৈর্ঘ্য দিতে হবে।
স্টাফেন চেজেলাস

উত্তর:


43

আরও মার্জিত? না

অপেক্ষাকৃত ছোট? হ্যা :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

এবং যদি আপনার স্বল্পতর হওয়ার পক্ষে আরও কমনীয়তার বাণিজ্য করতে সমস্যা না হয় তবে আপনার কাছে 2 লাইন কম স্ক্রিপ্ট থাকতে পারে:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

আপনি যদি মনে করেন এটি নিরাপদ বলে আপনি ডাবল বন্ধনী ব্যবহার করতে পারেন। এখানে ব্যাখ্যা


3

বোর্ন-সামঞ্জস্যপূর্ণ বিকল্প ( ${#string}পসিক্স তবে বোর্ন নয় (এমন নয় যে আপনি আজকাল কখনও বোর্ন শেল পেরিয়ে আসতে পারেন)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

নোট করুন যে উভয়ের জন্য ${#string}এবং ????এটি শেলটির উপর নির্ভর করে বাইট বা অক্ষরের সংখ্যা হবে কিনা। সাধারণত (এবং এটি পসিক্স দ্বারা প্রয়োজনীয়) এটি অক্ষরের সংখ্যা। তবে এর মতো কয়েকটি শেলগুলি dashমাল্টি-বাইট সচেতন নয়, পরিবর্তে এটি বাইট হবে।

সঙ্গে mksh, আপনি প্রয়োজন set -o utf8-modeইউনিকোড (UTF-8 লোকেলে) এটি বহু-বাইট অক্ষর বোঝার জন্য:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8

বিষয় echo Too longecho 'Too long'
স্টিভেন পেনি

এবং, আপনি যদি এটি "খুব দীর্ঘ" হয়ে থাকে কেবল তখন মুদ্রণ করবেন, তবে আমি আমার ifবিকল্পটিতে আরও কমপ্যাক্ট করতে পারি :)

2
@ স্টিভেনপেনি, echo Too longদুটি আর্গুমেন্ট ( Tooএবং long) পাস করে echoযা echoআউটপুটগুলিকে একটি স্পেস দ্বারা বিচ্ছিন্ন করে (এবং একটি নতুন লাইন অনুসরণ করে), যখন echo 'Too long'আমরা একটি Too longযুক্তিটি পাস করি echoযেখানে এটি একটি নিউলাইন অনুসরণ করে প্রদর্শিত হয়। সুতরাং এটি কার্যকরী সমতুল্য।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.