বাশে স্ট্রিং তুলনা। [[: পাওয়া যায় নি


165

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

#!/bin/bash
string='My string';

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

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

আমি উবুন্টুফর্মগুলি থেকেও চেষ্টা করেছি যা আপনি ২ য় পোস্টে পেতে পারেন

if [[ $var =~ regexp ]]; then
  #do something
fi

উভয় ক্ষেত্রেই আমি ত্রুটি পেয়েছি:

[[: not found

আমি কি ভুল করছি?


আমি এটি ভুল করতে পারি, তবে একক বর্গাকার বন্ধনী ব্যবহার করা সর্বদা আমার পক্ষে কাজ করে।
মার্কাস আনটারওয়াদিজিটর

1
কী /bin/bash --versionছাপবে?
থিমল

4
[এই ক্ষেত্রে কাজ করবে না, কারণ এটি নিদর্শনগুলিকে সমর্থন করে না।
আনসগার ওয়াইচারস

উত্তর:


157

[[বাশ-বিল্টিন আপনার /bin/bashআসল বাশ বলে মনে হচ্ছে না।


যদি আমি টাইপ করি: টাইপ করুন '[[' আমি পাই [[একটি শেল কীওয়ার্ড
ব্যবহারকারী 1581900

5
আপনি দৌড়ানোর সময় কি একই ফলাফল পাবেন /bin/bash -c "type [["?
আনসগার ওয়াইচারস

42
আমার সাথে এটি ঘটেছিল কারণ আমি #!/bin/bashআমার ফাইলটির শীর্ষে যুক্ত করতে ভুলে গিয়েছিলাম
মরফ্যাটিক

12
আমাকে হ'ল কারণ আমি স্ক্রিপ্টটি চালিয়েছি sh, হতাশার জন্য প্রচুর। এখন এই উত্তরটি সন্ধানের আগে আমি কেবল সমস্ত কিছু পূর্বাবস্থায় ফিরে যেতে হবে।
লুই লাউডগ ট্রোটিয়ার

174

আপনি কিভাবে আপনার স্ক্রিপ্ট চালাচ্ছেন? আপনি যদি সঙ্গে

$ sh myscript

আপনার চেষ্টা করা উচিত্:

$ bash myscript

বা, যদি স্ক্রিপ্টটি কার্যকর হয়:

$ ./myscript

sh এবং বাশ দুটি আলাদা শাঁস । প্রথম ক্ষেত্রে আপনি আপনার স্ক্রিপ্টটি শ দোভাষীর পক্ষে যুক্তি হিসাবে পাঠাচ্ছেন, দ্বিতীয় ক্ষেত্রে আপনি প্রথম লাইনে সিদ্ধান্ত নেন কোন দোভাষী ব্যবহার করা হবে।


আমি অনুমতি এইভাবে অস্বীকার পেয়েছি। sudo ./myscript সহ এর কমান্ডটি পাওয়া যায় নি
ব্যবহারকারী 1581900

11
না chmod + X myscript , তারপর আবার চালাতে, আপনি sudo প্রয়োজন হবে না
Akos কে

2
আপনি কীভাবে স্ক্রিপ্ট চালাচ্ছেন?
আকোস কে

যেমনটা তুমি বলেছিলে. সাধারণত আমি এটিকে 'mys sh myscipt.sh' দিয়ে কল করি। দ্বিতীয়বার chmod + x myscript.sh করার পরে আমি এটিকে ./myscript.sh দিয়ে বলেছি
user1581900

5
আপনি যখন স্ক্রিপ্টটি চালাবেন তখন ত্রুটিটি আশা করা যায় sh myscript.sh, কারণ /bin/shবোর্নে শেল যেখানে [[এমনিতেই অন্তর্নির্মিত নয় তা অনুকরণ করে । তবে স্ক্রিপ্টটি চালানোর মাধ্যমে ./script.shকোনও ত্রুটি হওয়া উচিত নয়, কারণ সেই ক্ষেত্রে শেবাং /bin/bashব্যবহার করা উচিত ।
আনসগার ওয়াইচারস

81

আপনার স্ক্রিপ্টের প্রথম লাইনটি:

#!/bin/bash

অথবা

#!/bin/sh

sh শেল এই ত্রুটি বার্তা উত্পাদন করে, বাশ নয়


1
প্রথম লাইনটি লেখকটির উল্লিখিত ত্রুটিটি তৈরি করার জন্যও আমার অনুপস্থিত ছিল!
বেনামে

14

হেরোকু টুলবেল্ট ইনস্টল করার সময় আমার এই সমস্যা হয়েছিল

এইভাবেই আমি সমস্যার সমাধান করেছি

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

যেমন আপনি দেখতে পাচ্ছেন, / বিন / শ হ'ল "ড্যাশ" (বাশ নয়) এর একটি লিঙ্ক, এবং [[এটি ব্যাশ সিনট্যাকটিক সুগারেস। সুতরাং আমি কেবল / বিন / ব্যাশের লিঙ্কটি প্রতিস্থাপন করেছি। আপনার সিস্টেমে এর মতো আরএম ব্যবহার করে যত্নশীল!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
shআপনার ডিস্ট্রোর জন্য ডিফল্টকে ওভাররাইড করা খারাপ পরামর্শ দেওয়া আইএমএইচও। একটি শেল যা দিয়ে চালিত হয় shতার সাথে কাজ করা উচিত dash; যদি তা না হয় তবে এটি স্ক্রিপ্টের একটি বাগ। আপনার যা দরকার তা যদি bashবৈশিষ্ট্য ব্যবহার bash, না sh
ট্রিপলি

4
এটি ভয়ানক
টিবিএইচ

2
আমি সম্মতি জানাই, এটি ছিল কেবল কুৎসিত কাজ। একটি অনুরূপ তবে আরও ভাল কাজ যেমন update-alternatives( justinconover.wordpress.com/2012/05/14/… এর মতো (ডেবিয়ান-ভিত্তিক-লিনাক্সে) ব্যবহার করা তবে শেষ পর্যন্ত, এটি একই হবে।
jperelli

13

@ অ্যাঙ্গার যেমনটি উল্লেখ করেছেন, [[এটি একটি বাশিজম, অর্থাত্ বাশের মধ্যে অন্তর্নির্মিত এবং অন্যান্য শেলের জন্য উপলভ্য নয়। আপনি যদি চান আপনার স্ক্রিপ্টটি পোর্টেবল হতে পারে তবে ব্যবহার করুন [। তুলনাগুলির জন্য আলাদা আলাদা সিনট্যাক্সেরও দরকার হবে: এতে পরিবর্তন ==করুন =


উবুন্টু ১.0.০৪ এবং (sh ->) ড্যাশ 0.5.8-2.1ubuntu2 এর সাথে কিছুটা পরীক্ষা করে দেখেছি যে ["-ইক" এবং একসাথে মিলে মিলে কাজ করে। এ প্রসঙ্গে জন্য তুলনা অপারেটর একই তথ্য এখানে পাওয়া যেতে পারে: stackoverflow.com/questions/10849297/... - যেমন পরবর্তী লিঙ্কে মধ্যে বাঞ্ছনীয় কিন্তু যে আমার ন্যূনতম আক্রমণকারী পরিবর্তনের জন্য ফেল করলো আমি আরো (()) মূল্যায়ন অপারেটর সঙ্গে cheked / বা / এর কোড পরিবর্তনের আরও গভীর স্তরের প্রয়োজন হবে। সফ্টপনোরমা.অর্গ
আলেকজান্ডার স্টোহর

3

স্ক্রিপ্টটি চলাকালীন sh এর পরিবর্তে বাশ উল্লেখ করুন। আমি ব্যক্তিগতভাবে লক্ষ্য করেছি যে ওবুন্টু 12.10 এর অধীনে এগুলি আলাদা different

bash script.sh arg0 ... argn


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