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


129

==অপারেটর শেল স্ক্রিপ্ট-এ দুটি স্ট্রিং তুলনা করতে ব্যবহৃত হয়। যাইহোক, আমি দুটি স্ট্রিং কে উপেক্ষা করার ক্ষেত্রে তুলনা করতে চাই, এটি কীভাবে করা যায়? এর জন্য কি কোনও মানক কমান্ড আছে?

উত্তর:


72

যদি তোমার বাশ থাকে

str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
 $str2 ) echo "match";;
 *) echo "no match";;
esac

অন্যথায়, আপনি কী শেল ব্যবহার করছেন তা আমাদের জানান।

বিকল্প, awk ব্যবহার করে

str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
  if ( tolower(s1) == tolower(s2) ){
    print "match"
  }
}'

32
যে কেউ ifস্টেটমেন্ট ব্যবহার করে স্ট্রিং তুলনা করে , shoptপদ্ধতির জন্য আপনাকে [[ ]]একক-বন্ধনী [ ]ফর্মের পরিবর্তে শর্তাধীন ডাবল-বন্ধনী ফর্মটি ব্যবহার করতে হবে । আরও দেখুন: gnu.org/software/bash/manual/html_node/The-Shopt-
বুলেটিন

3
প্রশ্নটি ইঙ্গিত দেয় যে ==দুটি স্ট্রিং তুলনা করতে ব্যবহৃত হয়, কিন্তু প্রতিক্রিয়া একটি caseবিবৃতি ব্যবহার করে কেস-সংবেদনশীল তুলনা দেখায় । এই আশ্বাসজনক, shoptসমাধান এছাড়াও কেস-অবশ ব্যবহার সক্ষম ==, =~অন্যান্য স্ট্রিং তুলনা অপারেটরদের, এবং।
তারানকি

7
ব্যাশের shopt -u nocasematchডিফল্টে ফিরতে তুলনা শেষ হওয়ার পরে সম্ভবত সম্পাদন করা বুদ্ধিমানের কাজ।
ওহাদ স্নাইডার

6
nocasematchসেটিংসটি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য সেরা । এটি ধরুন SHELLNOCASEMATCH=`shopt -p nocasematch`তারপরে এটি পরিবর্তন করুন shopt -s nocasematchএবং একবার হয়ে গেলে এটি দিয়ে পুনরুদ্ধার করুন$SHELLNOCASEMATCH
উড়হীসিদুর

2
আরও ভাল: SHELLNOCASEMATCH=$(shopt -p nocasematch; true)কারণ shopt -pবিকল্পটি সেট না করা থাকলে কোড 1 সহ প্রস্থান করবে set -eএবং কার্যকর হলে কার্যকর স্ক্রিপ্টটি বাতিল করতে পারে।
আমরা সমস্ত মনিকা

158

বাশ-এ, আপনি সমস্ত নিম্ন-/ আপার-ক্ষেত্রে স্ট্রিংটি পরিবর্তন করতে প্যারামিটার সম্প্রসারণ ব্যবহার করতে পারেন:

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}

14
কমপক্ষে একটি উত্তর যা শপ্ট বিকল্পটি বোঝায় না। সুতরাং আপনি দুটি স্ট্রিং উপেক্ষা করার ক্ষেত্রে এবং একই পরীক্ষায়, অন্য দুটি কেসের সাথে তুলনা করতে পারেন। ধন্যবাদ
জেহন

37
বাশ 4 এ কি নতুন? কমপক্ষে বাশ ৩.২.৫১ (ওএস এক্স ১০.৯-এ ব্যবহৃত) এটি কাজ করে না - প্রথম echoবিবৃতিটির ফলাফল:-bash: ${var1,,}: bad substitution
ফেলিক্স রাবে

1
এই জাতীয় কেস-সংবেদনশীল তুলনা বাস্তবায়ন স্থানীয়করণ সম্পর্কিত সমস্যাগুলির (যেমন তুর্কি আই সমস্যা হিসাবে) are আমি জানি না কীভাবে shopt -s nocasematchপ্রয়োগ করা হয় তবে সাধারণত "ভাষা-স্তর" সমাধানগুলি এটি সঠিকভাবে পরিচালনা করে।
ওহাদ স্নাইডার

5
@ ওহাদ স্নাইডার, তুর্কিদের তুর্কি স্থানীয়করণের সমস্যা নিয়ে উদ্বিগ্ন হতে দিন, আমার কেবল মাত্র একটি দ্রুত ও দক্ষ পন্থা ম্যাচ করার দরকার এবং এটি হিউউউউইজ মার্জিন দ্বারা কেকটি গ্রহণ করবে
নিকেন

1
ম্যাকস ব্যবহারকারীগণ, আপনার বাশ সংস্করণটি আপগ্রেড করুন। ইতিমধ্যে আপনার এক দশকেরও বেশি সময় পেরিয়ে গেছে। itnext.io/upgrading-bash-on-macos-7138bd1066ba
জেসন কার্টার

114

এই উত্তরগুলির সমস্তগুলি এটি করার সহজতম এবং দ্রুততম উপায়টিকে উপেক্ষা করে (যতক্ষণ না আপনার কাছে বাশ ৪ রয়েছে):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo ":)"
fi

আপনি সেখানে যা করছেন তা হ'ল উভয় স্ট্রিংকে ছোট হাতের মধ্যে রূপান্তর করা এবং ফলাফলের তুলনা করা।


6
এটি কেবল বাশ 4 বা আরও
নতুনতে

8
@ d4Rk যে কারণে আমার উত্তরের প্রথম বাক্যটি "যতক্ষণ আপনার বাশ 4 থাকে" বলে। এই কথাটি বলে, বাশ 4 এই মন্তব্যটি লেখার সময় সাত বছরেরও বেশি সময় ধরে ছিল এবং আমার নিজের ওএস এক্স ইনস্টলটি প্রায় দীর্ঘকাল ধরে এটি করেছে।
দাঙ্গা

@ রিওট দুঃখিত, এটি প্রথম স্থানে লক্ষ্য করেননি। আমি জানি যে আপনি ওএস এক্সে যা চান তা ইনস্টল করতে পারেন, তবে ডিফল্টটি 3.2 হয় এবং আমার স্ক্রিপ্টটি অবশ্যই বিভিন্ন ম্যাকের সাথে চলতে হবে, এটি আমার পক্ষে আসলে একটি বিকল্প নয়।
d4Rk

2
@ d4Rk এটি বোধগম্য - যদি আপনাকে সত্যিই বহনযোগ্যতার গ্যারান্টি দেওয়া প্রয়োজন তবে আমি পসিক্স শেল স্ট্যান্ডার্ডের সাথে লেগে থাকার পরামর্শ দিচ্ছি, কারণ কিছু ক্ষেত্রে আপনার কোনও সংস্করণের সন্ধানের নিশ্চয়তা নেই।
দাঙ্গা

1
আমি ঠিক এটিই খুঁজছিলাম। উচ্চতর হওয়া উচিত =)
রবিন উইনস্লো

39

নোকাসেম্যাচ অবস্থা সংরক্ষণ করুন (যদি কিছু অন্যান্য ফাংশন এটি অক্ষম হওয়ার উপর নির্ভর করে):

local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch

দ্রষ্টব্য: কেবলমাত্র localএটি কোনও ফাংশনের অভ্যন্তরে ব্যবহার করুন ।


4
চমৎকার কারণ caseবিবৃতিগুলি (ভুতুড়ির উত্তরগুলি সহ) সর্বদা আমার ত্বককে ক্রল করে
তুলবে

15

একটি উপায় হ'ল উভয় স্ট্রিংকে উপরের বা নিম্নে রূপান্তর করা:

test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different

আর একটি উপায় গ্রেপ ব্যবহার করা হবে:

echo "string" | grep -qi '^String$' && echo same || echo different

আমি trআলপাইন (যা এর shমাধ্যমে সরবরাহ করে busybox) এর উপর ভিত্তি করে আমার ডকার-আইজেড অ্যাপ্লিকেশনগুলিতে পদ্ধতিটি ব্যবহার করেছি । ধন্যবাদ.
এমএক্সওয়েস্ট

7

কার্ন শেলের জন্য, আমি টাইপসেট বিল্ট-ইন কমান্ড ব্যবহার করি (লোয়ার-কেসের জন্য -l এবং আপার-ক্ষেত্রে -u)।

var=True
typeset -l var
if [[ $var == "true" ]]; then
    print "match"
fi

2
এজেড বা অন্য কোনও প্রক্রিয়া শুরু করার চেয়ে পারফরম্যান্সের দিক থেকে এটি আরও ভাল।
অ্যালেক্স

1
ব্যাশে, ডিক্লেয়ার -l বা -u বৈশিষ্ট্যগুলি সেট করতে ব্যবহার করা যেতে পারে।
ভারত

5

খুব সহজে যদি আপনি কেস-সংবেদনশীল লাইন তুলনা করতে fgrep হন:

str1="MATCH"
str2="match"

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
    echo "case-insensitive match";
fi

if fgrep -qix -- "$str1" <<<"$str2"; thenপরিবর্তে এটি ব্যবহার করা ভাল ।

3

এখানে টিআর ব্যবহার করে আমার সমাধান দেওয়া হল:

var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
  echo "MATCH"
fi

3

grepএকটি -iপতাকা রয়েছে যার অর্থ কেস সংবেদনশীল তাই ভের 2 ভার 1 এ রয়েছে কিনা তা জানতে বলুন।

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi

3
var2-তে কোনও রেগেক্স বিশেষ অক্ষর থাকলে কাজ করবে না।
হরিদসভ

3

জন্য zshসিনট্যাক্স কিছুটা ভিন্ন, কিন্তু এখনও এখানে সবচেয়ে উত্তরের চেয়ে খাটো হল:

> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>

এটি তুলনার আগে উভয় স্ট্রিংকে বড় হাতের অক্ষরে রূপান্তরিত করবে।


অন্য পদ্ধতিটি zsh এর ব্যবহার করে globbing flags, যা আমাদের সরাসরি iগ্লোব পতাকা ব্যবহার করে কেস-সংবেদনশীল মিলের ব্যবহার করতে দেয় :

setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"


1

আমি এই দুর্দান্ত ব্লগ / টিউটোরিয়াল জুড়ে এসেছি / কেস সেনসিটিভ প্যাটার্ন নিয়ে কাজ করার বিষয়ে যাই হোক না কেন । নিম্নলিখিত তিনটি পদ্ধতি উদাহরণের সাথে বিশদে ব্যাখ্যা করা হয়েছে:

1. ট্র্যাক্ট কমান্ড ব্যবহার করে প্যাটার্নটি লোয়ারকেসে রূপান্তর করুন

opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
        sql)
                echo "Running mysql backup using mysqldump tool..."
                ;;
        sync)
                echo "Running backup using rsync tool..."
                ;;
        tar)
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other options"
                ;;
esac

২. কেস প্যাটার্ন সহ রেজেক্স ব্যবহার করুন

opt=$1
case $opt in
        [Ss][Qq][Ll])
                echo "Running mysql backup using mysqldump tool..."
                ;;
        [Ss][Yy][Nn][Cc])
                echo "Running backup using rsync tool..."
                ;;
        [Tt][Aa][Rr])
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other option"
                ;;
esac

৩. নোকাসেম্যাচ চালু করুন

opt=$1
shopt -s nocasematch
case $opt in
        sql)
                echo "Running mysql backup using mysqldump tool..."
                ;;
        sync)
                echo "Running backup using rsync tool..."
                ;;
        tar)
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other option"
                ;;
esac

shopt -u nocasematch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.