==
অপারেটর শেল স্ক্রিপ্ট-এ দুটি স্ট্রিং তুলনা করতে ব্যবহৃত হয়। যাইহোক, আমি দুটি স্ট্রিং কে উপেক্ষা করার ক্ষেত্রে তুলনা করতে চাই, এটি কীভাবে করা যায়? এর জন্য কি কোনও মানক কমান্ড আছে?
==
অপারেটর শেল স্ক্রিপ্ট-এ দুটি স্ট্রিং তুলনা করতে ব্যবহৃত হয়। যাইহোক, আমি দুটি স্ট্রিং কে উপেক্ষা করার ক্ষেত্রে তুলনা করতে চাই, এটি কীভাবে করা যায়? এর জন্য কি কোনও মানক কমান্ড আছে?
উত্তর:
যদি তোমার বাশ থাকে
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"
}
}'
==
দুটি স্ট্রিং তুলনা করতে ব্যবহৃত হয়, কিন্তু প্রতিক্রিয়া একটি case
বিবৃতি ব্যবহার করে কেস-সংবেদনশীল তুলনা দেখায় । এই আশ্বাসজনক, shopt
সমাধান এছাড়াও কেস-অবশ ব্যবহার সক্ষম ==
, =~
অন্যান্য স্ট্রিং তুলনা অপারেটরদের, এবং।
shopt -u nocasematch
ডিফল্টে ফিরতে তুলনা শেষ হওয়ার পরে সম্ভবত সম্পাদন করা বুদ্ধিমানের কাজ।
nocasematch
সেটিংসটি সংরক্ষণ এবং পুনরুদ্ধার করার জন্য সেরা । এটি ধরুন SHELLNOCASEMATCH=`shopt -p nocasematch`
তারপরে এটি পরিবর্তন করুন shopt -s nocasematch
এবং একবার হয়ে গেলে এটি দিয়ে পুনরুদ্ধার করুন$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
কারণ shopt -p
বিকল্পটি সেট না করা থাকলে কোড 1 সহ প্রস্থান করবে set -e
এবং কার্যকর হলে কার্যকর স্ক্রিপ্টটি বাতিল করতে পারে।
বাশ-এ, আপনি সমস্ত নিম্ন-/ আপার-ক্ষেত্রে স্ট্রিংটি পরিবর্তন করতে প্যারামিটার সম্প্রসারণ ব্যবহার করতে পারেন:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
বিবৃতিটির ফলাফল:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
প্রয়োগ করা হয় তবে সাধারণত "ভাষা-স্তর" সমাধানগুলি এটি সঠিকভাবে পরিচালনা করে।
এই উত্তরগুলির সমস্তগুলি এটি করার সহজতম এবং দ্রুততম উপায়টিকে উপেক্ষা করে (যতক্ষণ না আপনার কাছে বাশ ৪ রয়েছে):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
আপনি সেখানে যা করছেন তা হ'ল উভয় স্ট্রিংকে ছোট হাতের মধ্যে রূপান্তর করা এবং ফলাফলের তুলনা করা।
নোকাসেম্যাচ অবস্থা সংরক্ষণ করুন (যদি কিছু অন্যান্য ফাংশন এটি অক্ষম হওয়ার উপর নির্ভর করে):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
দ্রষ্টব্য: কেবলমাত্র local
এটি কোনও ফাংশনের অভ্যন্তরে ব্যবহার করুন ।
case
বিবৃতিগুলি (ভুতুড়ির উত্তরগুলি সহ) সর্বদা আমার ত্বককে ক্রল করে
একটি উপায় হ'ল উভয় স্ট্রিংকে উপরের বা নিম্নে রূপান্তর করা:
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
) এর উপর ভিত্তি করে আমার ডকার-আইজেড অ্যাপ্লিকেশনগুলিতে পদ্ধতিটি ব্যবহার করেছি । ধন্যবাদ.
কার্ন শেলের জন্য, আমি টাইপসেট বিল্ট-ইন কমান্ড ব্যবহার করি (লোয়ার-কেসের জন্য -l এবং আপার-ক্ষেত্রে -u)।
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
খুব সহজে যদি আপনি কেস-সংবেদনশীল লাইন তুলনা করতে fgrep হন:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
জন্য 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. ট্র্যাক্ট কমান্ড ব্যবহার করে প্যাটার্নটি লোয়ারকেসে রূপান্তর করুন
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
if
স্টেটমেন্ট ব্যবহার করে স্ট্রিং তুলনা করে ,shopt
পদ্ধতির জন্য আপনাকে[[ ]]
একক-বন্ধনী[ ]
ফর্মের পরিবর্তে শর্তাধীন ডাবল-বন্ধনী ফর্মটি ব্যবহার করতে হবে । আরও দেখুন: gnu.org/software/bash/manual/html_node/The-Shopt-