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


956

আমি কোন স্ট্রিংয়ের সাথে কোনও ভেরিয়েবলের তুলনা করব (এবং তারা মেলে যদি কিছু করে)?



আরও দেখুন: বাশ
কোডফোরস্টার

উত্তর:


1371

যদি স্টেটমেন্টগুলিতে ভেরিয়েবল ব্যবহার করা হয়

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

আপনি কিছু যখন তারা মিলছে না কি করতে চান তাহলে, প্রতিস্থাপন =সঙ্গে !=স্ট্রিং অপারেশন এবং পাটিগণিতের অপারেশনগুলি সম্পর্কে তাদের নিজ নিজ ডকুমেন্টেশনে আরও পড়তে পারেন ।

আমরা কেন চারপাশে উদ্ধৃতি ব্যবহার করব $x?

আপনি আশেপাশের উদ্ধৃতিগুলি চান $x, কারণ এটি খালি থাকলে, আপনার বাশ স্ক্রিপ্টটি নীচের মত দেখতে একটি সিনট্যাক্স ত্রুটির মুখোমুখি হয়েছে:

if [ = "valid" ]; then

==অপারেটরের অ-মানক ব্যবহার

দ্রষ্টব্য যে বাশ এর ==সাথে সমতার জন্য ব্যবহার করতে দেয় [তবে এটি মানক নয়

প্রথম ক্ষেত্রেটি ব্যবহার করুন যার চারপাশে উদ্ধৃতিগুলি al $xচ্ছিক:

if [[ "$x" == "valid" ]]; then

বা দ্বিতীয় কেসটি ব্যবহার করুন:

if [ "$x" = "valid" ]; then

12
এটি অপ্রত্যাশিত অপারেটরের ত্রুটিতে প্রদত্ত গৃহীত উত্তরের সাথে কীভাবে সম্পর্কিত ? ব্যবহার করার সময় আমি একই ত্রুটি পেয়েছি [ "$1" == "on" ]। এটিকে ["$ 1" = "অন"] এ পরিবর্তন করা সমস্যার সমাধান করেছে।
পাইটর ডব্রোগস্ট

78
ফাঁকা জায়গা প্রয়োজন।
TAAPSogeking

6
@ জনফেমিনেলা বাশ স্ক্রিপ্টে লেখার সময় এটির একটি =এবং দুটি নয়।
ব্যবহারকারী 13107

72
আপনি যেটি ব্যবহার করতে পারবেন না তা লক্ষ করার মতো হতে পারে [ $x -eq "valid" ]-eqপূর্ণসংখ্যার জন্য তুলনা অপারেটর, স্ট্রিং নয়।
ক্র্যাক

2
@ অ্যালেক্স, কোন ক্ষেত্রে আমাকে (যদি কখনও) প্যাটার্নটি ব্যবহার করা দরকার তবে ["x$yes" == "xyes"]এটি ভেরিয়েবল এবং স্ট্রিং উভয়কে একটি দিয়ে উপস্থাপিত করে x? এটি কি পুরানো সময়ের প্রতীক বা কিছু পরিস্থিতিতে এটি সত্যই প্রয়োজন?
ল্যানক্সিক্স

141

অথবা, যদি আপনার আর কোনও ধারা প্রয়োজন না হয়:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

70
এবং যদি আপনার আর একটি ধারা প্রয়োজন হয় এবং একটি ক্রেজি ওয়ান-লাইনার তৈরি করতে চান: ["$ x" == "বৈধ"] && প্রতিধ্বনি "বৈধ" || প্রতিধ্বনি "অবৈধ"
ম্যাট হোয়াইট

11
@ ম্যাটওয়াইট: echoব্যর্থ হতে পারে এটি সাধারণত একটি খারাপ ধারণা ।
gniourf_gniourf

1
এমনকি gotchas যে প্রদর্শিত হতে পারে, উভয় Marko && MattWhite থেকে সুন্দর এবং মার্জিত উপায়ে হউক না কেন
Deko

3
@gniourf_gniourf, কোনও সমস্যা নেই, ব্যবহার করুন [ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
12431234123412341234123

4
@ 12431234123412341234123 এর { echo invalid && false; }চেয়ে বেশি দক্ষ ( echo invalid && false ), কারণ এটি একটি অপ্রয়োজনীয় সাবস্কেলের জন্য অর্থ প্রদান করা এড়ানো যায়।
চার্লস ডাফি

84
a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

মন্তব্য:

  1. মধ্যে শূন্যস্থানের ifএবং [এবং ]গুরুত্বপূর্ণ
  2. >এবং <পুনঃনির্দেশ অপারেটর তাই স্ট্রিং সহ \>এবং \<যথাক্রমে এটিকে এড়িয়ে যান।

6
স্ট্রিং বর্ণানুসারে তুলনা করার জন্য ধন্যবাদ
দয়া

আমার সমস্যাটি হ'ল $aপ্রকৃতপক্ষে " "স্ট্রিং আক্ষরিক মানের অংশ হিসাবে এটি ঘিরে ছিল , সুতরাং $bমানগুলি তুলনা করতে আমাকে পালানোর চরিত্রটি ব্যবহার করতে হয়েছিল। দৌড়ানোর পরে আমি এটি খুঁজে পেতে সক্ষম হয়েছি bash -x ./script.sh, -x পতাকা আপনাকে প্রতিটি সম্পাদনের মান দেখতে দেয় এবং ডিবাগিংয়ে সহায়তা করে।
শাহনেওয়াজখান

নোট করুন যে বর্ণানুক্রমিক অর্ডার তুলনাটি পসিক্স-মানক নয়, সুতরাং এটি নন-জিএনইউ প্ল্যাটফর্ম / নন-ব্যাশ শেলগুলিতে কাজ করার গ্যারান্টিযুক্ত নয়। কেবলমাত্র pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlঅপারেশনগুলি পোর্টেবল হওয়ার গ্যারান্টিযুক্ত।
চার্লস ডাফি

62

ওয়াইল্ডকার্ড ব্যবহারের সাথে স্ট্রিংগুলির তুলনা করতে

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

12
এটা গুরুত্বপূর্ণ যে ওয়াইল্ডকার্ডগুলি কেবল ডানদিকে ব্যবহার করা যেতে পারে! "ওয়াইল্ডকার্ডের চারপাশে নিখোঁজ হওয়াটিও নোট করুন । (
বিটিডব্লিউ

6
সম্প্রসারণ $stringB নয় উদ্ধৃত করা (এবং প্রসঙ্গক্রমে, বাম দিকে উদ্ধৃত করা দরকার নেই): if [[ $stringA = *"$stringB"* ]]; then
gniourf_gniourf

আমি ফাইলপ্যাথে ফাইলের নামের জন্য একই ওয়াইল্ডকার্ড যুক্তি ব্যবহার করার চেষ্টা করছি। তবে এটি আমার পক্ষে কাজ করছে না। এখানে প্রদত্ত সমস্ত বিভিন্ন ওয়াইল্ডকার্ড স্ট্রিং চেষ্টা করে। তবে এটি সর্বদা অন্য ক্ষেত্রে যায়। আমার ক্ষেত্রে স্ট্রিংএ ফাইল ফাইল / টিএমপি / ফাইল এবং স্ট্রিংবি "ফাইল"।
বৃষ্টি

35

এক মন্তব্যে আমার একমত হতে হবে:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

না, এটি কোনও পাগল অনলাইনার নয়

এটি দেখতে একে একে হুম, অবিচ্ছিন্ন ...

এটি একটি ভাষা হিসাবে সাধারণ নিদর্শনগুলি ব্যবহার করে;

এবং ভাষা শিখার পরে।

আসলে, এটি পড়ে ভাল লাগছে

এটি একটি সাধারণ যৌক্তিক প্রকাশ, একটি বিশেষ অংশ সহ: লজিক অপারেটরদের অলস মূল্যায়ন।

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

প্রতিটি অংশ একটি যৌক্তিক প্রকাশ; প্রথমটি সত্য বা মিথ্যা হতে পারে, অন্য দুটি সত্যই সত্য।

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

এখন, যখন এটি মূল্যায়ন করা হয়, প্রথমটি পরীক্ষা করা হয়। যদি এটি মিথ্যা হয় তবে লজিকের দ্বিতীয় অপারেন্ডের চেয়ে এবং && এটি প্রাসঙ্গিক নয়। প্রথমটি সত্য নয়, সুতরাং এটি প্রথম হতে পারে না এবং দ্বিতীয়টি যাইহোক, সত্য হতে পারে।
এখন, এক্ষেত্রে লজিকের প্রথম দিকটি বা || মিথ্যা, তবে অন্য পক্ষ - তৃতীয় অংশটি সত্য হলে এটি সত্য হতে পারে।

সুতরাং তৃতীয় অংশটি মূল্যায়ন করা হবে - প্রধানত একটি পার্শ্ব প্রতিক্রিয়া হিসাবে বার্তা লিখতে। (এটি 0সত্যের জন্য ফলাফল রয়েছে , যা আমরা এখানে ব্যবহার করি না)

অন্যান্য কেসগুলি একই, তবে সহজ - এবং - আমি প্রতিশ্রুতি দিই! হয় - হতে পারে - পড়া সহজ!
(আমার কাছে এটি নেই, তবে আমি মনে করি ধূসর দাড়িযুক্ত ইউনিক্সের অভিজ্ঞ ব্যক্তি এতে অনেক সাহায্য করে))


17
... && ... || ...সাধারণত (সমস্ত এই সময়ের জন্য দুঃখিত বৃদ্ধলোক ইউনিক্স ঝুনা, আপনি চলেছি ভুল) উপর ভ্রূকুটি যেমন শব্দার্থগতভাবে সমতূল্য না হয় if ... then ... else ...। চিন্তা করবেন না, এটি একটি সাধারণ ক্ষতি
gniourf_gniourf

6
@gniourf_gniourf ওপি ভুল নয় - বা আপনার পরামর্শ অনুসারে তারা সম্ভবত অজ্ঞ। ... && ... || ...একটি নিখুঁতভাবে বৈধ প্যাটার্ন এবং একটি সাধারণ বাশ প্রতিমা। এটির ব্যবহার পূর্বের জ্ঞানকে নির্দেশ করে (যা দর্শকদের মধ্যে যদি প্রাথমিকভাবে থাকে তবে এটি মনে রাখা ভাল) তবে ওপিতে চুল রয়েছে যাতে তারা কীভাবে খোলা ম্যানহোলের কভারগুলি এড়ানো যায় তা প্রমাণ করার জন্য hair
ইবপা

3
@ ইবপা যদি বিবৃতি অনুসরণ করে && এর মিথ্যা মান দেয়, তবে তার বক্তব্য অনুসরণ করলে তা কার্যকর হবে || ? যদি তাই হয় তবে এটি ভুল এবং সম্ভবত গনিউরফ পরামর্শ দিচ্ছে
টিএসজি

4
আমি ভেবেছিলাম প্রতিধ্বনি একটি উদাহরণ মাত্র। নীচের বিবরণটি && এর পরেও একটি শূন্য-মান ফিরে আসতে পারে
টিএসজি

2
বাশ পিটফলস লিঙ্ক পোস্ট করার জন্য @gniourf_gniourf +1! খুব দরকারী!
জাগুয়ার

21

আপনি ব্যবহারের ক্ষেত্রে / এস্যাক ব্যবহার করতে পারেন

case "$string" in
 "$pattern" ) echo "found";;
esac

এই সমতা বা থাকে?
ytpillai

@ আইটপিল্লাই, এটি সমতুল্য। মনে রাখবেন আপনি |আগে প্যাটার্ন দ্বারা পৃথক করতে পারেন )inবিবৃতি সমতূল্য thenমধ্যে ifবিবৃতি। আপনি তর্ক করতে পারেন এটি নিদর্শনগুলির তালিকার উপরে কাজ করে, যেখানে প্রতিটি লিস্টের পাইথন থেকে আগত হলে কী করা উচিত তার নিজস্ব ঘোষণা রয়েছে। পছন্দ না substring in string, বরং for item in list*আপনি যদি কোনও elseশর্ত চান তবে আপনার সর্বশেষ বিবৃতি হিসাবে একটি ব্যবহার করুন । এটি প্রথম এনকাউন্টারে ফিরে আসে।
mazunki

18

নিম্নলিখিত স্ক্রিপ্টটি "টেস্টনথিস" নামক একটি ফাইল থেকে রেখায় পড়ে এবং তারপরে প্রতিটি লাইনকে একটি সাধারণ স্ট্রিং, একটি বিশেষ অক্ষর এবং একটি নিয়মিত প্রকাশের সাথে একটি স্ট্রিংয়ের সাথে তুলনা করে। যদি এটি মেলে না, তবে স্ক্রিপ্টটি লাইনটি মুদ্রণ করবে, অন্যথায় নয়।

বাশে স্পেস এত গুরুত্বপূর্ণ। সুতরাং নিম্নলিখিতটি কাজ করবে:

[ "$LINE" != "table_name" ] 

তবে নিম্নলিখিতগুলি এটি করবে না:

["$LINE" != "table_name"] 

সুতরাং দয়া করে যেমন ব্যবহার করুন:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

একটি ফাইল মাধ্যমে যেতে এই পদ্ধতির ব্যবহার করুন। এটি হ'ল অন্যান্য জিনিসের মধ্যে ইউইউসিও সরান।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

এটি কারণ হিসাবে গুরুত্বপূর্ণ bashনয় কারণ [এটি আসলে একটি বাহ্যিক বাইনারি (যেমন which [ফলন হিসাবে কিছু /usr/bin/[)
প্যাট্রিক বার্গনার

11

ইনপুটটিতে কেবল কয়েকটি বৈধ এন্ট্রি থাকলে আমি সম্ভবত রেজিএক্সএক্স ম্যাচগুলি ব্যবহার করব। যেমন কেবলমাত্র "শুরু" এবং "স্টপ" বৈধ ক্রিয়া।

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

নোট করুন যে আমি $ACTIONডাবল কমা ব্যবহার করে ভেরিয়েবলটি ছোট করে আছি । এছাড়াও মনে রাখবেন যে এটি খুব বেশি বয়সী বাশ সংস্করণগুলিতে কাজ করবে না।


9

বাশ 4+ উদাহরণ। দ্রষ্টব্য: শব্দের মধ্যে শূন্যস্থান ইত্যাদি থাকাতে কোট ব্যবহার না করা সমস্যার কারণ হয়ে দাঁড়াবে Always

এখানে বাশ 4+ এর কয়েকটি উদাহরণ রয়েছে:

উদাহরণ 1, স্ট্রিংয়ে 'হ্যাঁ' পরীক্ষা করুন (সংবেদনশীল ক্ষেত্রে):

    if [[ "${str,,}" == *"yes"* ]] ;then

উদাহরণ 2, স্ট্রিংয়ে 'হ্যাঁ' পরীক্ষা করুন (সংবেদনশীল ক্ষেত্রে):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

উদাহরণ 3, স্ট্রিংয়ে 'হ্যাঁ' পরীক্ষা করুন (কেস সেনসিটিভ):

     if [[ "${str}" == *"yes"* ]] ;then

উদাহরণ 4, স্ট্রিংয়ে 'হ্যাঁ' পরীক্ষা করুন (কেস সংবেদনশীল):

     if [[ "${str}" =~ "yes" ]] ;then

5 উদাহরণ, সঠিক মিল (সংবেদনশীল কেস):

     if [[ "${str}" == "yes" ]] ;then

উদাহরণ 6, সঠিক মিল (সংবেদনশীল কেস):

     if [[ "${str,,}" == "yes" ]] ;then

উদাহরণ 7, সঠিক মিল:

     if [ "$a" = "$b" ] ;then

উপভোগ করুন।


আমার জন্য (ম্যাক জিএনইউ বাশ সংস্করণ 4.4.12 (1) -রিলেজ x86_64-আপেল-ডারউইন 17.0.0), আমাকে ব্যবহার করতে হবে if [ "$a"="$b" ]বা এটি কাজ করে না ... সমান চারপাশে স্পেস থাকতে পারে না
বর্ণালী

1

আমি এটি এমনভাবে করেছি যা বাশ এবং ড্যাশ (শি) এর সাথে সামঞ্জস্যপূর্ণ :

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac

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