কোনও স্ট্রিংয়ে বাশে একটি স্ট্রিং থাকে কিনা তা কীভাবে পরীক্ষা করবেন


2564

আমার বাশে স্ট্রিং রয়েছে:

string="My string"

এটিতে অন্য স্ট্রিং থাকলে আমি কীভাবে পরীক্ষা করতে পারি?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

কোথায় ??আমার অজানা অপারেটর। আমি কি প্রতিধ্বনি ব্যবহার করি এবং grep?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

দেখতে কিছুটা আনাড়ি লাগছে।


4
হাই, খালি স্ট্রিং যদি মিথ্যা হয় তবে কেন আপনি এটিকে আনাড়ি মনে করেন? প্রস্তাবিত সমাধানগুলি সত্ত্বেও এটি আমার জন্য একমাত্র উপায় ছিল।
এরিকসন.সেপদা

1
আপনি exprএখানে কমান্ডটি ব্যবহার করতে পারেন
ক্লায়েন্ট__

4
: এখানে posix শাঁস জন্য এক stackoverflow.com/questions/2829613/...
sehe

উত্তর:


3646

আপনি যদি ডাবল বন্ধনী ব্যবহার করেন তবে আপনি কেস স্টেটমেন্টের বাইরেও মার্কাসের উত্তর (* ওয়াইল্ডকার্ডস) ব্যবহার করতে পারেন:

string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

নোট করুন যে সুই স্ট্রিংয়ের ফাঁকা স্থানগুলিকে ডাবল উদ্ধৃতিগুলির মধ্যে স্থাপন করা দরকার এবং *ওয়াইল্ডকার্ডগুলি বাইরে থাকা উচিত। এছাড়াও লক্ষ করুন যে একটি সাধারণ তুলনা অপারেটর ব্যবহার করা হয় (যেমন ==), রেজেক্স অপারেটর নয় =~


126
এছাড়াও নোট করুন যে আপনি পরীক্ষায় কেবলমাত্র = = এ গিয়ে তুলনাটি বিপরীত করতে পারেন। উত্তরের জন্য ধন্যবাদ!
কুইন টেইলর 17

63
@ জোনিক: আপনি শিবাং মিস করছেন বা এটি যেমন থাকতে পারে #!/bin/sh#!/bin/bashপরিবর্তে চেষ্টা করুন।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

10
বন্ধনী এবং সামগ্রীগুলির মধ্যে একটি স্থান রেখে দিন Leave
পল দাম

17
আপনার [[]] এর ভিতরে ভেরিয়েবলগুলি উদ্ধৃত করার দরকার নেই। এটি ঠিক একইভাবে কাজ করবে: [[$ স্ট্রিং == $ সুই ]] && এর প্রতিধ্বনি পাওয়া গেল
অরওলোফিল

12
নিবন্ধন করুন আপনি প্রথম যুক্তিতে কেবল ডাবল উদ্ধৃতিগুলি বাদ দিতে পারেন [[। দেখুন ideone.com/ZSy1gZ
nyuszika7h

611

আপনি যদি রেজেক্স পদ্ধতির পছন্দ করেন তবে:

string='My string';

if [[ $string =~ "My" ]]
then
   echo "It's there!"
fi

2
বাশ স্ক্রিপ্টে একটি egrep রেজেক্স প্রতিস্থাপন করতে হবে, এটি পুরোপুরি কাজ করেছে!
বিস্ফোরণ_হর্দিজ

114
=~অপারেটর ইতিমধ্যে একটি ম্যাচের জন্য পুরো স্ট্রিং অনুসন্ধান করে; .*এর এখানে বিদেশী হয়। এছাড়াও, কোটগুলি ব্যাকস্ল্যাশগুলির পক্ষে সাধারণত পছন্দনীয়:[[ $string =~ "My s" ]]
বুকজর

16
@bukzor দর এখানে ব্যাশ 3.2+ হিসাবে কাজ করা বন্ধ করে: tiswww.case.edu/php/chet/bash/FAQ E14) । কোনও ভেরিয়েবলের (কোট ব্যবহার করে) নির্ধারণ করা ভাল, তারপরে তুলনা করুন। এটি পছন্দ করুন:re="My s"; if [[ $string =~ $re ]]
seanf

36
যদি এটিতে স্ট্রিং না থাকে তবে পরীক্ষা করুন : if [[ ! "abc" =~ "d" ]]সত্য।
ক্রিসওয়েবদেভ

1
নোট করুন যে ক্রমটি পরীক্ষাটি ঘটে সেটির বিষয়টি গুরুত্বপূর্ণ। কোডের নিম্নলিখিত লাইন আউটপুট এগিয়ে 2. হতে হবেnumber=2; if [[ "1, 2, 4, 5" = *${number}* ]]; then echo forward $number; fi; if [[ *${number}* = "1, 2, 4, 5" ]]; then echo backwards $number; fi;
Douwe ভ্যান ডার Leest

356

আমি যদি একটি বিবৃতি ব্যবহার সম্পর্কে নিশ্চিত নই তবে আপনি কেস স্টেটমেন্টের সাথে একই রকম প্রভাব পেতে পারেন:

case "$string" in 
  *foo*)
    # Do stuff
    ;;
esac

76
এটি পিক্স শেল পোর্টেবল হওয়ায় এটি সম্ভবত সেরা সমাধান। (ওরফে কোনও বাশিজম নেই)
টেকনোসরাস

25
@ টেকনোসৌরাস আমার কাছে কেবল বাশ ট্যাগ রয়েছে এমন একটি প্রশ্নে "বাশিজম" সমালোচনা করা তার চেয়ে অদ্ভুত মনে হয়েছে :)
পিপি

39
@ পিপি আরও সীমিত সমাধানের চেয়ে বেশি সার্বজনীন সমাধানের পছন্দ হিসাবে এটি এতটা সমালোচনা নয়। দয়া করে বিবেচনা করুন, বহু বছর পরে, লোকেরা (আমার মতো) এই উত্তরটি খুঁজতে থামবে এবং মূল প্রশ্নের চেয়ে বিস্তৃত ক্ষেত্রের জন্য দরকারী এমন কোনওটি খুঁজে পেয়ে খুশি হতে পারে। ওপেন সোর্স বিশ্বে তারা যেমন বলে: "পছন্দটি ভাল!"
কার্ল স্মট্রিক্জ

2
@ টেকনোসরাস, এফডব্লিউআইডাব্লু [[ $string == *foo* ]]কিছু পসিক্স অনুগত শ সংস্করণগুলিতেও কাজ করে (উদাহরণস্বরূপ /usr/xpg4/bin/shসোলারিস 10) এবং ksh (> = 88)
ম্যাক্সচলেপজিগ

3
ব্যসিবক্স অ্যাশ এস্টারিস্কগুলি পরিচালনা করে না [[... কেস-স্যুইচ কাজ করেছে!
রে ফোস

232

stringContain রূপগুলি (সামঞ্জস্যপূর্ণ বা ক্ষেত্রে স্বতন্ত্র)

এই স্ট্যাক ওভারফ্লো উত্তরগুলি বেশিরভাগ ক্ষেত্রে বাশ সম্পর্কে বলে , আমি এই পোস্টের একেবারে নীচে একটি স্বাধীন স্বতন্ত্র বাশনের ঘটনা পোস্ট করেছি ...

যাইহোক, আমার আছে

সামঞ্জস্যপূর্ণ উত্তর

বাশ-নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করে ইতিমধ্যে ইতিমধ্যে প্রচুর উত্তর রয়েছে, তাই ব্যাসিবক্সের মতো দরিদ্র-বৈশিষ্ট্যযুক্ত শেলগুলির নীচে কাজ করার একটি উপায় রয়েছে :

[ -z "${string##*$reqsubstr*}" ]

বাস্তবে, এটি দিতে পারে:

string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
  if [ -z "${string##*$reqsubstr*}" ] ;then
      echo "String '$string' contain substring: '$reqsubstr'."
    else
      echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
  done

এটি বাশ, ড্যাশ , কর্নশেল ( ksh) এবং অ্যাশ ( ব্যজিবক্স ) এর অধীনে পরীক্ষা করা হয়েছিল এবং ফলাফল সর্বদা:

String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.

একটি ফাংশনে

@ ইয়েরো অ্যালটনেন জিজ্ঞাসাবাদ অনুসারে এখানে একই শেলের অধীনে পরীক্ষিত একই ডেমোটির একটি সংস্করণ রয়েছে:

myfunc() {
    reqsubstr="$1"
    shift
    string="$@"
    if [ -z "${string##*$reqsubstr*}" ] ;then
        echo "String '$string' contain substring: '$reqsubstr'.";
      else
        echo "String '$string' don't contain substring: '$reqsubstr'."
    fi
}

তারপর:

$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.

$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.

বিজ্ঞপ্তি: আপনাকে পালাতে হবে বা ডাবল এনকোলেস উদ্ধৃতি এবং / অথবা ডাবল উদ্ধৃতি:

$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.

$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.

সাধারণ ফাংশন

এটি ব্যাসিবক্স, ড্যাশ এবং অবশ্যই বাশের অধীনে পরীক্ষা করা হয়েছিল:

stringContain() { [ -z "${2##*$1*}" ]; }

তারপর এখন:

$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes

... অথবা যদি সাবজেক্ট স্ট্রিংটি ফাঁকা থাকতে পারে, যেমন @ এসজলভার দ্বারা নির্দেশিত, ফাংশনটি হয়ে উঠবে:

stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }

বা অ্যাড্রিয়ান গন্টারের মন্তব্য অনুসারে , -oসুইচগুলি এড়িয়ে চলেন :

stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}

চূড়ান্ত (সহজ) ফাংশন:

এবং পরীক্ষাগুলি তাদের সম্ভাব্যতর দ্রুত করার জন্য বিপরীত করা:

stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}

খালি স্ট্রিং সহ:

$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no

কেস ইন্ডিপেন্ডেন্ট (কেবল বাশ!)

কেস যত্ন না নিয়ে স্ট্রিং পরীক্ষা করার জন্য, প্রতিটি স্ট্রিংকে কেবল নিম্ন কেসিতে রূপান্তর করুন:

stringContain() {
    local _lc=${2,,}
    [ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}

পরীক্ষা করে দেখুন:

stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no

1
এটি আরও ভাল হবে, যদি আপনি এটি কোনও ফাংশনে রাখার কোনও উপায় বের করতে পারেন।
ইয়েরো অ্যালটোনেন

2
@ EeroAaltonen আপনি আমার (নতুন যুক্ত) ফাংশনটি কীভাবে খুঁজে পাবেন?
এফ। হাউরি

2
আমি জানি! অনুসন্ধান . -নাম "*" | xargs গ্রেপ "মাইফাঙ্ক" 2> / দেব / নাল
বেগুন

6
এটি দুর্দান্ত কারণ এটি অত্যন্ত সামঞ্জস্যপূর্ণ। যদিও একটি বাগ: খড়ের খালি খালি থাকলে এটি কাজ করে না। সঠিক সংস্করণটি হবে string_contains() { [ -z "${2##*$1*}" ] && [ -n "$2" -o -z "$1" ]; } একটি চূড়ান্ত চিন্তা: খালি স্ট্রিংটিতে খালি স্ট্রিং থাকে? উপরের সংস্করণগুলি হ্যাঁ ( -o -z "$1"অংশের কারণে )।
Sjlver

3
+1 টি। খুব ভালো! আমার জন্য আমি অর্ডার স্ট্রিংকন্টেন () {[-z "$ {1 ## * $ 2 *}"] && [-z "$ 2" -o -n "$ 1"] পরিবর্তন করেছি; }; "কোথায় অনুসন্ধান করুন" "কী সন্ধান করুন"। ব্যস্তবক্সে কাজ করুন। উপরে গৃহীত উত্তর ব্যস্তবক্সে কাজ করবেন না।
ব্যবহারকারী 3439968

148

আপনার মনে রাখা উচিত যে শেল স্ক্রিপ্টিং কোনও ভাষার চেয়ে কম এবং কমান্ডের সংকলনের বেশি। তাত্পর্যপূর্ণভাবে আপনি মনে করেন যে এই "ভাষা" এর জন্য আপনার ifএকটি [বা একটি দিয়ে অনুসরণ করা প্রয়োজন [[। এগুলি উভয়ই কেবল কমান্ড যা সফলতা বা ব্যর্থতা (অন্য প্রতিটি কমান্ডের মতো) নির্দেশ করে একটি প্রস্থান স্থিতি ফিরে আসে। এই কারণে আমি কমান্ডটি ব্যবহার করব grepনা [

শুধু কর:

if grep -q foo <<<"$string"; then
    echo "It's there"
fi

এখন আপনি যে ifকমান্ডটি অনুসরণ করে (আধা-কোলন দিয়ে সম্পূর্ণ) এর প্রস্থান স্থিতি পরীক্ষা করার কথা ভাবছেন, আপনি যে স্ট্রিংটির পরীক্ষা করছেন তার উত্সটি কেন পুনর্বিবেচনা করবেন না?

## Instead of this
filetype="$(file -b "$1")"
if grep -q "tar archive" <<<"$filetype"; then
#...

## Simply do this
if file -b "$1" | grep -q "tar archive"; then
#...

-qবিকল্প হিসাবে আমরা কেবল রিটার্ন কোড চাই না আউটপুট কিছু, grep করে তোলে। <<<শেলটি পরবর্তী শব্দটি প্রসারিত করে এবং এটিকে <<এখানে নথির এক-লাইন সংস্করণ কমান্ডের ইনপুট হিসাবে ব্যবহার করবে (আমি নিশ্চিত নই যে এটি স্ট্যান্ডার্ড বা বাশিজম কিনা)।


7
তাদের এখানে স্ট্রিং বলা হয় (৩.6. I) আমি বিশ্বাস করি এটি বাশিজম
alex.pilon

10
কেউ প্রসেস সাবস্টিটিউশনও ব্যবহার করতে পারেনif grep -q foo <(echo somefoothing); then
লার্স

নোটটি echoঅপ্রয়োজনীয়, যদি আপনি কোনও ভেরিয়েবল পাস করে থাকেন তবে printf '%s' "$stringপরিবর্তে ব্যবহার করুন।
nyuszika7h

5
এর grep -q foo <<<"$mystring"ব্যয়টি অত্যন্ত ব্যয়বহুল: 1 টি কাঁটাচামচ করা এবং বাশিজম করা এবং echo $mystring | grep -q foo2 টি কাঁটাচামচ করা (পাইপের জন্য একটি এবং দ্বিতীয়টি চালানোর জন্য /path/to/grep)
এফ হৌরি

1
echoযুক্তি স্ট্রিংটিতে ব্যাকস্ল্যাশ সিক্যুয়েন্স উপস্থিত থাকলে পতাকা ছাড়াই ব্রুনো ব্রোনোস্কি এখনও অপ্রত্যাশিত বহনযোগ্য সমস্যা হতে পারে। echo "nope\c"কিছু প্ল্যাটফর্মে echo -e "nope"অন্যদের মতো কাজ করার আশা করা হচ্ছে । printf '%s' "nope"বনামprintf '%s\n' 'nope\c'
ট্রিপলি

92

গৃহীত উত্তরটি সেরা, তবে এটি করার একাধিক উপায় ছাড়াও এখানে আরও একটি সমাধান রয়েছে:

if [ "$string" != "${string/foo/}" ]; then
    echo "It's there!"
fi

${var/search/replace}হয় $varপ্রথম নিদর্শনের সঙ্গে searchদ্বারা প্রতিস্থাপিত replace, যদি পাওয়া যায় (এটা পরিবর্তন করে না $var)। যদি আপনি fooকিছু না করে প্রতিস্থাপনের চেষ্টা করেন , এবং স্ট্রিংটি পরিবর্তন হয়েছে, তবে অবশ্যই fooপাওয়া গেল।


5
উপরের সংস্করণের সমাধান:> `যদি [" $ স্ট্রিং "! =" $ {স্ট্রিং / foo /} "]; তারপরে "এটি সেখানে আছে!" ব্যজিবক্সের শেল অ্যাশ ব্যবহার করার সময় ফাই কার্যকর হয় । গৃহীত সমাধানটি ব্যাসিবক্সের সাথে কাজ করে না কারণ কিছু ব্যাশের নিয়মিত প্রকাশগুলি কার্যকর হয় না।
টিপোশেল

1
পার্থক্য বৈষম্য। বেশ অদ্ভুত চিন্তা! আমি এটি পছন্দ করি
nitinr708

1
আপনার স্ট্রিং যদিও 'foo' না হয়
ভিনিমাস

আমি নিজেই এই একই সমাধানটি লিখেছিলাম (কারণ আমার দোভাষী উক্ত উত্তরগুলি গ্রহণ করবেন না) তারপরে আরও উন্নততর সন্ধান করতে গিয়েছিলেন, তবে এটি খুঁজে পেয়েছেন!
বুভিন জে

56

সুতরাং প্রশ্নটির অনেকগুলি কার্যকর সমাধান রয়েছে - তবে কোনটি সবচেয়ে দ্রুত সংস্থান করে / সবচেয়ে কম সংস্থান ব্যবহার করে?

এই ফ্রেমটি ব্যবহার করে পুনরাবৃত্তি পরীক্ষা:

/usr/bin/time bash -c 'a=two;b=onetwothree; x=100000; while [ $x -gt 0 ]; do TEST ; x=$(($x-1)); done'

প্রতিবার TEST প্রতিস্থাপন করা হচ্ছে:

[[ $b =~ $a ]]           2.92 user 0.06 system 0:02.99 elapsed 99% CPU

[ "${b/$a//}" = "$b" ]   3.16 user 0.07 system 0:03.25 elapsed 99% CPU

[[ $b == *$a* ]]         1.85 user 0.04 system 0:01.90 elapsed 99% CPU

case $b in *$a):;;esac   1.80 user 0.02 system 0:01.83 elapsed 99% CPU

doContain $a $b          4.27 user 0.11 system 0:04.41 elapsed 99%CPU

(doContain এফ। হুরির উত্তর ছিল)

এবং গিগলসের জন্য:

echo $b|grep -q $a       12.68 user 30.86 system 3:42.40 elapsed 19% CPU !ouch!

সুতরাং সরল প্রতিস্থাপন বিকল্পটি সম্ভবত বর্ধিত পরীক্ষায় বা কোনও ক্ষেত্রে জিতবে। কেস পোর্টেবল।

100000 গ্রেপগুলি পাইপ করা অনুমানযোগ্যভাবে বেদনাদায়ক! প্রয়োজন ছাড়াই বাহ্যিক ইউটিলিটিগুলি ব্যবহার সম্পর্কে পুরানো নিয়মটি সত্য।


4
ঝরঝরে বেঞ্চমার্ক। আমাকে ব্যবহার করতে রাজি [[ $b == *$a* ]]
ম্যাড পদার্থবিজ্ঞানী

2
আমি যদি এটি সঠিকভাবে পড়ছি caseতবে সর্বকালের সর্বকালের সবচেয়ে কম সময় ব্যয় করে। আপনি $b in *$aযদিও পরে একটি তারকাচিহ্ন অনুপস্থিত । আমি বাগ বাগ সংশোধন করার [[ $b == *$a* ]]চেয়ে তুলনায় কিছুটা দ্রুত ফলাফল পেয়েছি case, তবে এটি অবশ্যই অন্যান্য কারণের উপর নির্ভর করতে পারে।
ট্রিপলি

1
ideone.com/5roEVt আমার কিছু অতিরিক্ত বাগ সংশোধন করে একটি পৃথক দৃশ্যের জন্য পরীক্ষা করেছে (যেখানে স্ট্রিংটি প্রকৃতপক্ষে দীর্ঘতর স্ট্রিংয়ে উপস্থিত নেই)। ফলাফলগুলি বেশিরভাগ ক্ষেত্রে একই রকম; [[ $b == *$a* ]]দ্রুত এবং caseপ্রায় তত দ্রুত (এবং আনন্দদায়ক পসিক্স-সামঞ্জস্যপূর্ণ)।
ট্রিপলি

28

এটিও কাজ করে:

if printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  printf "Found needle in haystack"
fi

এবং নেতিবাচক পরীক্ষাটি হ'ল:

if ! printf -- '%s' "$haystack" | egrep -q -- "$needle"
then
  echo "Did not find needle in haystack"
fi

আমি মনে করি এই স্টাইলটি খানিকটা ক্লাসিক - বাশ শেলের বৈশিষ্ট্যের উপর নির্ভরশীল নয়।

--যুক্তি বিশুদ্ধ POSIX প্যারানয়া, যেমন বিকল্প, অনুরূপ ইনপুট স্ট্রিং বিরুদ্ধে আরো বেশি সুরক্ষিত করতে ব্যবহৃত হয় --abcবা -a

দ্রষ্টব্য: একটি টান লুপে এই কোডটি অভ্যন্তরীণ বাশ শেল বৈশিষ্ট্যগুলি ব্যবহার করার চেয়ে অনেক ধীর হবে কারণ এক (বা দুটি) পৃথক প্রক্রিয়া তৈরি হবে এবং পাইপের মাধ্যমে সংযুক্ত হবে।


5
... তবে ওপি কোন সংস্করণের বাশ বলে না ; উদাহরণস্বরূপ, পুরানো বাশের (যেমন সোলারিস প্রায়শই থাকে) এর মধ্যে এই নতুন বাশ বৈশিষ্ট্যগুলি অন্তর্ভুক্ত নাও হতে পারে। (সোলারিস ডাব্লু / ব্যাশ ২.০ এ আমি এই সঠিক সমস্যায় পড়েছি (বাশ প্যাটার্নের মিলটি বাস্তবায়িত হয়নি))
মাইকেল 25

2
echoঅপ্রয়োজনীয়, printf '%s' "$haystackপরিবর্তে আপনার ব্যবহার করা উচিত ।
nyuszika7h

2
না, কেবল echoকিছুই বাদে এড়িয়ে চলুন ছাড়া আক্ষরিক পাঠ্য যা একটি দিয়ে শুরু হয় না -। এটি আপনার পক্ষে কাজ করতে পারে তবে এটি বহনযোগ্য নয়। এমনকি বাশদের বিকল্পটি সেট echoকরা আছে কিনা তার উপর নির্ভর করে ভিন্ন আচরণ করবে xpg_echoPS: আমি আমার আগের মন্তব্যে ডাবল উদ্ধৃতিটি বন্ধ করতে ভুলে গেছি।
nyuszika7h

1
@kevinarpe আমি নিশ্চিত, নই --তালিকাভুক্ত করা না থাকে জন্য POSIX বৈশিষ্টprintf , কিন্তু আপনি ব্যবহার করা উচিত printf '%s' "$anything"সমস্যা এড়ানোর জন্য যদি যাহাই হউক না কেন, $anythingএকটি রয়েছে %অক্ষর।
nyuszika7h

1
@ কেভিনার্পে তার ভিত্তিতে এটি সম্ভবত।
nyuszika7h

21

বাশ 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

উদাহরণ 8, ওয়াইল্ডকার্ড ম্যাচ। পাঠ্য (কেস সংবেদনশীল):

     if echo "$a" | egrep -iq "\.(mp[3-4]|txt|css|jpg|png)" ; then

উপভোগ করুন।


17

এটি সম্পর্কে:

text="   <tag>bmnmn</tag>  "
if [[ "$text" =~ "<tag>" ]]; then
   echo "matched"
else
   echo "not matched"
fi

2
= re রিজএক্সপ্যাক্স ম্যাচের জন্য, অতএব ওপি এর উদ্দেশ্যটির জন্য খুব শক্তিশালী।

16

যেমন পল তার অভিনয় তুলনায় উল্লেখ করেছেন :

if echo "abcdefg" | grep -q "bcdef"; then
    echo "String contains is true."
else
    echo "String contains is not true."
fi

এটি মার্কস দ্বারা প্রদত্ত জবাব 'কেস "$ স্ট্রিং" এর মতো মেনে চলতে পসিক্স , তবে কেস স্টেটমেন্টের উত্তরের চেয়ে পড়া সহজ কিছুটা সহজ। এছাড়াও মনে রাখবেন যে কেস স্টেটমেন্ট ব্যবহার করার চেয়ে এটি অনেক ধীর হবে। পল যেমন উল্লেখ করেছেন, এটি কোনও লুপে ব্যবহার করবেন না।


11

এই স্ট্যাক ওভারফ্লো উত্তরটি কেবল স্থান এবং ড্যাশ অক্ষরগুলিকে ফাঁদে ফেলেছিল:

# For null cmd arguments checking   
to_check=' -t'
space_n_dash_chars=' -'
[[ $to_check == *"$space_n_dash_chars"* ]] && echo found

এটি এই একই প্রশ্নের উত্তর।
পিটার মর্টেনসেন

9
[[ $string == *foo* ]] && echo "It's there" || echo "Couldn't find"

আমি যুক্ত করব যে echo "Couldn't findশেষে এই বিবৃতিটি এই মিলিত কমান্ডগুলির জন্য 0 প্রস্থান স্থিতিগুলি ফিরিয়ে দেওয়ার জন্য একটি দুর্দান্ত কৌশল।
নিকডজিমেনেজ

@nicodjimenez আপনি এই সমাধানের মাধ্যমে প্রস্থান স্থিতি আর লক্ষ্য করতে পারবেন না। স্থিতি বার্তাগুলি দ্বারা প্রস্থান স্থিতি গিলেছে ...
জাহিদ

1
ঠিক এটাই আমি বোঝাতে চাইছিলাম ... যদি আপনার না থাকে || echo "Couldn't find"তবে কোনও মিল না থাকলে আপনি একটি ত্রুটি প্রস্থান স্থিতি ফিরিয়ে আনবেন, যা আপনি চাইলে সিআই পাইপলাইন চালাচ্ছেন যদি না চান তবে উদাহরণস্বরূপ যেখানে আপনি সমস্ত কমান্ড ফিরে যেতে চান
ত্রুটিবিহীন

9

এক:

[ $(expr $mystring : ".*${search}.*") -ne 0 ] && echo 'yes' ||  echo 'no'

2
exprএই সুইস-আর্মি-ছুরি ইউটিলিটিগুলির মধ্যে একটি যা সাধারণত আপনার যা যা করা দরকার তা করতে পারে, একবার কীভাবে এটি করতে হবে তা বুঝতে পারলে, তবে একবার কার্যকর হয়ে গেলে আপনি কখনই কেন বা কীভাবে এটি কাজ করছে তা মনে করতে পারেন না, তাই আপনি কখনও এটিকে স্পর্শ করবেন না এবং আশা করি এটি যা করছে তা কখনই থামবে না।
মাইকেল 25

@ অ্যালিসমহদল আমি কখনই ভোট-নিবেদন করি না, ডাউনভোটগুলি কেন দেওয়া হয়েছিল তা নিয়ে আমি কেবল পোস্ট করছি। একটি সতর্কতা মন্তব্য। exprদুর্লভ উপলক্ষে আমি ব্যবহার করি , যখন পোর্টেবিলিটি বাশ ব্যবহার (যেমন, পুরানো সংস্করণগুলিতে অসঙ্গতিপূর্ণ আচরণ), ত্রি (সর্বত্র অসামঞ্জস্যপূর্ণ) বা সিড (কখনও কখনও খুব ধীর) ব্যবহার করে বাধা দেয়। তবে ব্যক্তিগত অভিজ্ঞতা থেকে, যখনই এই exprজীবগুলি পুনরায় পড়তে হবে , আমাকে ম্যান পৃষ্ঠায় ফিরে যেতে হবে। সুতরাং, আমি কেবল মন্তব্য করব যে প্রতিটি ব্যবহারের জন্য exprমন্তব্য করা হবে ...
মাইকেল মাইকেল

1
এমন একটি সময় ছিল যখন আপনার কাছে থাকা সমস্ত কিছুই আসল বোর্ন শেল। এটা কিছু সাধারণভাবে দরকারি বৈশিষ্টগুলিকে ইঙ্গিতও তাই টুলস পছন্দ exprএবং testতাদের সম্পাদন করতে বাস্তবায়িত হয়েছে। এই দিন এবং যুগে সাধারণত আরও ভাল সরঞ্জাম থাকে, তাদের মধ্যে অনেকগুলি কোনও আধুনিক শেল হিসাবে নির্মিত। আমার ধারণা testএখনও সেখানে ঝুলছে, তবে কেউ অনুপস্থিত বলে মনে হচ্ছে না expr
ট্রিপলি

6

আমি সেড পছন্দ করি

substr="foo"
nonsub="$(echo "$string" | sed "s/$substr//")"
hassub=0 ; [ "$string" != "$nonsub" ] && hassub=1

সম্পাদনা করুন, যুক্তি:

  • স্ট্রিং থেকে সাবস্ট্রিংয়ের উদাহরণ সরাতে সেড ব্যবহার করুন

  • যদি নতুন স্ট্রিং পুরানো স্ট্রিং থেকে পৃথক হয়, সাবস্ট্রিং বিদ্যমান


2
দয়া করে কিছু ব্যাখ্যা যুক্ত করুন। অন্তর্নিহিত যুক্তি প্রদর্শন করা কেবল কোড দেওয়ার চেয়ে বেশি গুরুত্বপূর্ণ, কারণ এটি ওপি এবং অন্যান্য পাঠকদের এই এবং এই জাতীয় সমস্যাগুলিকে নিজেরাই ঠিক করতে সহায়তা করে
জুলান

5

grep -q এই উদ্দেশ্যে দরকারী।

একই ব্যবহার করে awk:

string="unix-bash 2389"
character="@"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

আউটপুট:

খুঁজে পাওয়া যায়নি

string="unix-bash 2389"
character="-"
printf '%s' "$string" | awk -vc="$character" '{ if (gsub(c, "")) { print "Found" } else { print "Not Found" } }'

আউটপুট:

পাওয়া

আসল উত্স: http://unstableme.blogspot.com/2008/06/bash-search-letter-in-string-awk.html


3
echoঅপ্রয়োজনীয়, printf '%s' "$string"পরিবর্তে আপনার ব্যবহার করা উচিত । আমি উত্তরটি সম্পাদনা করছি কারণ ব্যবহারকারীর আর উপস্থিতি নেই।
nyuszika7h

কোন উপায়ে echoপোর্টেবল নয়, @ nyuszika7h?
স্টারবিয়াম্রেনবোলাব

5

আমার বেশিরভাগ ঘন ঘন এই কার্যকারিতাটির দরকার পড়েছিল, তাই আমি নিজের .bashrcমতো একটি ঘরের তৈরি শেল ফাংশনটি ব্যবহার করছি যা নামটি মনে রাখার সহজ সাথে আমাকে এটি যতবার প্রয়োজন তার পুনরায় ব্যবহার করতে দেয়:

function stringinstring()
{
    case "$2" in
       *"$1"*)
          return 0
       ;;
    esac
    return 1
}

$string1(বলুন, এবিসি ) অন্তর্ভুক্ত রয়েছে কিনা তা পরীক্ষা করতে $string2(বলুন, 123abcABC ) আমাকে কেবল চালানো stringinstring "$string1" "$string2"এবং ফেরতের মান পরীক্ষা করা দরকার , উদাহরণস্বরূপ

stringinstring "$str1" "$str2"  &&  echo YES  ||  echo NO

[["$ আরআর " == $ সাবস্ট্রাস্ট ]] && ইকো হ্যাঁ || প্রতিধ্বনি নং
ইলিয়াস

আমি নিশ্চিত যে xহ্যাকটি কেবলমাত্র খুব পুরানো শাঁসের জন্য প্রয়োজনীয় ।
nyuszika7h

5

আমার .bash_ প্রোফাইলে ফাইল এবং আমি কীভাবে গ্রেপ ব্যবহার করেছি:

যদি PATH এনভায়রনমেন্ট ভেরিয়েবলটিতে আমার দুটি binডিরেক্টরি অন্তর্ভুক্ত থাকে তবে সেগুলি সংযোজন করবেন না,

# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

U=~/.local.bin:~/bin

if ! echo "$PATH" | grep -q "home"; then
    export PATH=$PATH:${U}
fi

1
এটি কি একটি উত্তর?
কোডফোরস্টার

ভোট দিন। গ্রেপ, যখন আরও শক্তিশালী, উপলব্ধ হওয়ার চেয়ে বেশি, তখন বাশ কীভাবে তা করে তা শিখতে কেন বিরক্ত করবেন না। এছাড়াও রীতির একটি তালিকা বিরুদ্ধে ম্যাচিং দ্বারা একটি বিট আরও এটি প্রসারিত: grep -q -E 'pattern1|...|patternN'
মোহাম্মদ বানা

4

প্রশ্নের উত্তরটির উত্তর এখানে দেওয়া হয়েছে আপনি কীভাবে বলবেন যে কোনও স্ট্রিংটিতে POSIX sh এ অন্য স্ট্রিং রয়েছে? :

এই সমাধানটি বিশেষ অক্ষরের সাথে কাজ করে:

# contains(string, substring)
#
# Returns 0 if the specified string contains the specified substring,
# otherwise returns 1.
contains() {
    string="$1"
    substring="$2"

    if echo "$string" | $(type -p ggrep grep | head -1) -F -- "$substring" >/dev/null; then
        return 0    # $substring is in $string
    else
        return 1    # $substring is not in $string
    fi
}

contains "abcd" "e" || echo "abcd does not contain e"
contains "abcd" "ab" && echo "abcd contains ab"
contains "abcd" "bc" && echo "abcd contains bc"
contains "abcd" "cd" && echo "abcd contains cd"
contains "abcd" "abcd" && echo "abcd contains abcd"
contains "" "" && echo "empty string contains empty string"
contains "a" "" && echo "a contains empty string"
contains "" "a" || echo "empty string does not contain a"
contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef"
contains "abcd efgh" " " && echo "abcd efgh contains a space"

contains "abcd [efg] hij" "[efg]" && echo "abcd [efg] hij contains [efg]"
contains "abcd [efg] hij" "[effg]" || echo "abcd [efg] hij does not contain [effg]"

contains "abcd *efg* hij" "*efg*" && echo "abcd *efg* hij contains *efg*"
contains "abcd *efg* hij" "d *efg* h" && echo "abcd *efg* hij contains d *efg* h"
contains "abcd *efg* hij" "*effg*" || echo "abcd *efg* hij does not contain *effg*"

পরীক্ষা contains "-n" "n"এখানে কাজ করে না, কারণ বিকল্প হিসাবে echo -nগিলে ফেলবে -n! তার জন্য একটি জনপ্রিয় স্থির printf "%s\n" "$string"পরিবর্তে ব্যবহার করা।
জোয়েটউইল


4

যেহেতু POSIX / ব্যাসিবক্স প্রশ্নটি সঠিক উত্তর (আইএমএইচও) সরবরাহ না করে বন্ধ রয়েছে, তাই আমি এখানে একটি উত্তর পোস্ট করব।

সংক্ষিপ্ততম উত্তরটি হ'ল:

[ ${_string_##*$_substring_*} ] || echo Substring found!

অথবা

[ "${_string_##*$_substring_*}" ] || echo 'Substring found!'

মনে রাখবেন যে, ডবল হ্যাশ হয় বাধ্যতামূলক কিছু শাঁস সঙ্গে ( ash)। উপরেরগুলি [ stringvalue ]যখন স্ট্রিংংটি পাওয়া যায় না তখন মূল্যায়ন করবে । এটি কোনও ত্রুটি প্রদান করে না। যখন স্ট্রিংয়ের সন্ধান পাওয়া যায় ফলাফল খালি হয় এবং এটি মূল্যায়ন করে [ ]। স্ট্রিংটি পুরোপুরি প্রতিস্থাপিত হওয়ার কারণে এটি ত্রুটি কোড 1 নিক্ষেপ করবে (কারণে *)।

সবচেয়ে সংক্ষিপ্ততর সাধারণ বাক্য গঠন:

[ -z "${_string_##*$_substring_*}" ] && echo 'Substring found!'

অথবা

[ -n "${_string_##*$_substring_*}" ] || echo 'Substring found!'

আরেকটা:

[ "${_string_##$_substring_}" != "$_string_" ] && echo 'Substring found!'

অথবা

[ "${_string_##$_substring_}" = "$_string_" ] || echo 'Substring found!'

একক সমান চিহ্ন লক্ষ করুন !



3

ওবাশ চেষ্টা করুন।

এটি বাশ ৪ এর জন্য একটি ওও-স্টাইলের স্ট্রিং গ্রন্থাগার। এটি জার্মান আমলাটদের সমর্থন করে। এটি বাশে লেখা আছে।

অনেক ফাংশন পাওয়া যায়: -base64Decode, -base64Encode, -capitalize, -center, -charAt, -concat, -contains, -count, -endsWith, -equals, -equalsIgnoreCase, -reverse, -hashCode, -indexOf, -isAlnum, -isAlpha, -isAscii, -isDigit, -isEmpty, -isHexDigit, -isLowerCase, -isSpace, -isPrintable, -isUpperCase, -isVisible, -lastIndexOf, -length, -matches, -replaceAll, -replaceFirst, -startsWith, -substring, -swapCase, -toLowerCase, -toString, -toUpperCase, -trim, এবং -zfill

এ লুক রয়েছে উদাহরণ:

[Desktop]$ String a testXccc
[Desktop]$ a.contains tX
true
[Desktop]$ a.contains XtX
false

ওবাশ সোর্সফোর্জন.নেটে পাওয়া যায়


2

আমি এই ফাংশনটি ব্যবহার করি (একটি নির্ভরতা অন্তর্ভুক্ত নয় তবে সুস্পষ্ট)। এটি নীচে প্রদর্শিত পরীক্ষাগুলি পাস করে। যদি ফাংশনটি 0 মান দেয় তবে স্ট্রিংটি পাওয়া গেল। পরিবর্তে আপনি সহজেই 1 বা 0 ফিরতে পারেন।

function str_instr {
   # Return position of ```str``` within ```string```.
   # >>> str_instr "str" "string"
   # str: String to search for.
   # string: String to search.
   typeset str string x
   # Behavior here is not the same in bash vs ksh unless we escape special characters.
   str="$(str_escape_special_characters "${1}")"
   string="${2}"
   x="${string%%$str*}"
   if [[ "${x}" != "${string}" ]]; then
      echo "${#x} + 1" | bc -l
   else
      echo 0
   fi
}

function test_str_instr {
   str_instr "(" "'foo@host (dev,web)'" | assert_eq 11
   str_instr ")" "'foo@host (dev,web)'" | assert_eq 19
   str_instr "[" "'foo@host [dev,web]'" | assert_eq 11
   str_instr "]" "'foo@host [dev,web]'" | assert_eq 19
   str_instr "a" "abc" | assert_eq 1
   str_instr "z" "abc" | assert_eq 0
   str_instr "Eggs" "Green Eggs And Ham" | assert_eq 7
   str_instr "a" "" | assert_eq 0
   str_instr "" "" | assert_eq 0
   str_instr " " "Green Eggs" | assert_eq 6
   str_instr " " " Green "  | assert_eq 1
}

সাসপেন্স! কি হল নির্ভরতা?
পিটার মর্টেনসেন

"Str_escape_spected_characters" ফাংশন। এটি GitHub arcshell_str.sh ফাইলে রয়েছে। arcshell.io আপনাকে সেখানে পাবেন।
ইথান পোস্ট


0
msg="message"

function check {
    echo $msg | egrep [abc] 1> /dev/null

    if [ $? -ne 1 ];
    then 
        echo "found" 
    else 
        echo "not found" 
    fi
}

check

এটি a বা b বা c এর যে কোনও ঘটনা খুঁজে পাবে


0

জেনেরিক সুই খড়ের উদাহরণটি ভেরিয়েবলের সাথে অনুসরণ করছে

#!/bin/bash

needle="a_needle"
haystack="a_needle another_needle a_third_needle"
if [[ $haystack == *"$needle"* ]]; then
    echo "needle found"
else
    echo "needle NOT found"
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.