শেল স্ক্রিপ্টিং ক্ষেত্রে কেস সংবেদনশীলতা


10

এই বাশ স্ক্রিপ্ট বিবেচনা করুন:

#!/bin/bash
echo Enter any character
read char
case $char in
    [a-z]) echo Lower case letter
            ;;
    [A-Z]) echo Upper case letter
            ;;
    [0-9]) echo Number
            ;;
    ?) echo Special char
            ;;
    *) echo You entered more than one character 
            ;;
esac

আমি যদি 'এ' লিখি, আউটপুটটি লোয়ার কেস লেটার , এবং এটি 'এ' এর জন্য একই ... আমি কীভাবে এটি পরাভূত করব?


যখন আপনি কোনও স্ক্রিপ্ট পোস্ট করেন তা নিশ্চিত করে নিন যে আপনি কোডের ফর্ম্যাটটি ব্যবহার করেছেন, শ্বেত স্পেস রাখার জন্য। এছাড়াও, আসল প্রশ্নটি কী? আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই ...
এজেফেরিস

2
@ আরোনিকাল দরকার নেই, প্রতিধ্বনি সংরক্ষিত শব্দগুলির সাথে ডিল করতে পারে echo if case then do
টেরডন

একটি অনুরূপ সমস্যার জন্য, কিন্তু সাজানোর সঙ্গে তার আচরণ দেখতে askubuntu.com/questions/597924/...
জো

উত্তর:


20
#!/bin/bash
echo 'enter any character'
read char
case $char in
[[:lower:]]) echo 'lower case letter'
    ;;
[[:upper:]]) echo 'upper case letter'
    ;;
[0-9]) echo 'number'
    ;;
?) echo 'special char'
    ;;
*) echo 'u entered more than one char' 
    ;;
esac  

নিম্নতর মামলার নিয়মিত প্রকাশ [অ্যাজেড] এবং উপরের ক্ষেত্রে নিয়মিত প্রকাশ [এজেড] বাশ-এ আরও তথ্যের জন্য দেখুন নোকাসেম্যাচ বন্ধ থাকলে কেস স্টেটমেন্ট কেস-সংবেদনশীল নয়?


6
এর পরিবর্তে [0-9]আপনার পরিবর্তে ব্যবহার করতে পারবেন [[:digit:]]। আপনি man grepগুগল পোস্টিক্স অক্ষর ক্লাসে আরও উদাহরণ পেতে পারেন ।
ধানের ল্যান্ডাউ

21

সমস্যাটি হ'ল চরিত্রের পরিসীমাটি [a-z]আসলে বড় হাতের অক্ষরগুলিকে অন্তর্ভুক্ত করে। এটি ব্যাশ ম্যানুয়ালটিতে ব্যাখ্যা করা হয়েছে :

একটি বন্ধনী এক্সপ্রেশন মধ্যে, একটি পরিসীমা এক্সপ্রেশন দুটি হাইফেন দ্বারা পৃথক দুটি অক্ষর নিয়ে গঠিত। এটি অন্তর্ভুক্ত সহ দুটি চরিত্রের মধ্যে সাজানো যে কোনও একক অক্ষরের সাথে মেলে। ডিফল্ট সি লোকালে, বাছাইয়ের ক্রম হল দেশীয় চরিত্রের ক্রম; উদাহরণস্বরূপ, '[বিজ্ঞাপন]' '[abcd]' এর সমতুল্য। অন্যান্য লোকেলগুলিতে, বাছাইয়ের ক্রমটি নির্দিষ্ট করা হয়নি, এবং '[বিজ্ঞাপন]' '[abcd]' বা '[aBbCcDd]' এর সমতুল্য হতে পারে , বা এটি কোনও অক্ষর, বা অক্ষরের সেটের সাথে ব্যর্থ হতে পারে ম্যাচগুলি এমনকি ত্রুটিযুক্ত হতে পারে। ব্র্যাকেট প্রকাশের traditionalতিহ্যগত ব্যাখ্যা পেতে, আপনি 'সি' মানের সাথে LC_ALL এনভায়রনমেন্ট ভেরিয়েবল সেট করে 'সি' স্থানীয় ব্যবহার করতে পারেন।

বর্ণনা করা:

$ case B in [a-c]) echo YES;;  *) echo NO;; esac
YES
$ LC_ALL=C; case B in [a-c]) echo YES;; *) echo NO;; esac
NO

সুতরাং, যা ঘটে তা হল আপনার লোকালে (যা তা নয় C) [a-c]আসলে [aAbBcC]। এজন্য আপনার পরিবর্তে @ কারেল দ্বারা প্রস্তাবিত পসিক্স অক্ষর ক্লাসগুলি ব্যবহার করা উচিত ।


4
আরও স্পষ্টতই, আপনাকে সেট LC_COLLATEকরতে হবে C, অন্যান্য লোকেল সেটিংস আলাদা হওয়ার পক্ষে এটি ঠিক। LC_COLLATEযে কোনও কিছুতে সেট করা Cখুব কমই একটি ভাল ধারণা তবে দুঃখজনকভাবে উবুন্টু এটি করে (এটি কেবলমাত্র একমাত্র অপরাধী নয়)।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.