स्ट्रिंग बैश में तुलना। [[: नहीं मिला


165

मैं स्ट्रिंग्स की तुलना बैश में करने की कोशिश कर रहा हूं। मैं पहले से ही कैसे पर यह करने के लिए पर एक जवाब मिला stackoverflow । स्क्रिप्ट में मैं कोशिश कर रहा हूं, मैं एडम द्वारा प्रस्तुत प्रश्न में दिए गए कोड का उपयोग कर रहा हूं:

#!/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

मैंने ubuntuforums से भी संपर्क करने की कोशिश की, जिसे आप दूसरी पोस्ट में पा सकते हैं

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

दोनों मामलों में मुझे त्रुटि मिली:

[[: not found

मैं क्या गलत कर रहा हूं?


मैं इसे गलत कर सकता हूं, लेकिन एक एकल वर्ग ब्रैकेट का उपयोग करना हमेशा मेरे लिए काम करता था।
मार्कस उंटवडित्जर

1
क्या /bin/bash --versionछपता है?
थीम

4
[इस मामले में काम नहीं करेगा, क्योंकि यह पैटर्न का समर्थन नहीं करता है।
अंसार विचर

जवाबों:


157

[[बैश-बिलिन है। आपका /bin/bashवास्तविक बैश नहीं लगता है।


अगर मैं टाइप करता हूँ: 'टाइप करें [[' 'I get [[एक शेल कीवर्ड है
user1581900

5
जब आप दौड़ते हैं तो क्या आपको वही परिणाम मिलते हैं /bin/bash -c "type [["?
अंसार विचर

42
मेरे साथ ऐसा हुआ क्योंकि मैं #!/bin/bashअपनी फ़ाइल के शीर्ष पर जोड़ना भूल गया
morphatic

12
मुझे खुशी है क्योंकि मैं स्क्रिप्ट के साथ भाग गया sh, हताशा के लिए बहुत कुछ। अब मुझे बस इस उत्तर को खोजने से पहले सब कुछ फिर से करना होगा।
लुई लाउडोग ट्रॉटियर

174

आप अपनी स्क्रिप्ट कैसे चला रहे हैं? अगर आपने साथ दिया

$ sh myscript

तुम्हें कोशिश करनी चाहिए:

$ bash myscript

या, यदि स्क्रिप्ट निष्पादन योग्य है:

$ ./myscript

और बैश दो अलग-अलग गोले हैं । जबकि पहले मामले में आप अपनी स्क्रिप्ट को sh दुभाषिया के तर्क के रूप में पारित कर रहे हैं, दूसरे मामले में आप बहुत पहली पंक्ति पर निर्णय लेते हैं कि दुभाषिया का उपयोग किया जाएगा।


मुझे इस तरह से अनुमति मिली। sudo ./myscript के साथ इसकी कमांड नहीं मिली
user1581900

11
है chmod + x myscript , उसके बाद फिर से चलाने के लिए, आप sudo की जरूरत नहीं है
एकोस कश्मीर

2
आप कैसे स्क्रिप्ट का आह्वान कर रहे हैं?
अकोस के।

जैसा कि आपने कहा। आम तौर पर मैं इसे '$ sh myscipt.sh' कहता हूं। 2 बार chmod + x myscript.sh करने के बाद मैंने इसे ./mcriptcript.sh
user1581900

5
जब आप स्क्रिप्ट चलाते हैं तो त्रुटि की उम्मीद की जाती है sh myscript.sh, क्योंकि /bin/shएक बॉर्न शेल का अनुकरण करता है जहां [[एक बिलिन नहीं है। हालाँकि, स्क्रिप्ट को चलाने से ./script.shत्रुटि उत्पन्न नहीं होनी चाहिए, क्योंकि उस स्थिति में शेबंग का /bin/bashउपयोग किया जाना चाहिए ।
20gar में अंसार विचर

81

आपकी स्क्रिप्ट में पहली पंक्ति है:

#!/bin/bash

या

#!/bin/sh

sh शेल इस त्रुटि संदेशों को उत्पन्न करता है, न कि bash को


1
लेखक द्वारा उल्लिखित त्रुटि का निर्माण करने के लिए पहली पंक्ति भी गायब थी!
बेनामी

14

Heroku Toolbelt को स्थापित करते समय मुझे यह समस्या थी

इस तरह मैंने समस्या का समाधान किया

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

जैसा कि आप देख सकते हैं, / बिन / श "डैश" (बश नहीं) के लिए एक कड़ी है, और [[बैश सिंथैटिक शुगर है। इसलिए मैंने बस लिंक को / bin / bash में बदल दिया। अपने सिस्टम में इस तरह से rm का उपयोग करने वाले सावधान!

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

6
shअपने डिस्ट्रो के लिए डिफ़ॉल्ट को ओवरराइड करना बीमार-सलाही IMHO है। एक शेल जो साथ चलाया shजाता है dash, उसके साथ काम करना चाहिए ; यदि ऐसा नहीं होता है, तो यह स्क्रिप्ट में एक बग है। यदि आपको bashसुविधाओं की आवश्यकता है, तो उपयोग करें bash, नहीं sh
ट्रिपलए

4
यह भयानक tbh लगता है
MrVaykadji

2
मैं मानता हूं, यह सिर्फ एक बदसूरत काम था। एक समान लेकिन बेहतर वर्कअराउंड का उपयोग करना होगा update-alternatives(डेबियन-आधारित-लिनक्स में) इस justinconover.wordpress.com/2012/05/14/… की तरह। लेकिन अंत में भी ऐसा ही होगा।
जेरपल्ली 13

13

जैसा कि @ एंसगर ने उल्लेख किया है, [[एक बशीवाद है, अर्थात बाश में बनाया गया और अन्य गोले के लिए उपलब्ध नहीं है। यदि आप चाहते हैं कि आपकी स्क्रिप्ट पोर्टेबल हो, तो उपयोग करें [। तुलनाओं के लिए एक अलग वाक्यविन्यास की भी आवश्यकता होगी: परिवर्तन के ==लिए =


उबंटू 16.04 और (sh ->) डैश के साथ थोड़ा सा जाँचें 0.5.8-2.1ubuntu2 और पाया कि ["-q" और अलाइक के संयोजन में ठीक काम करता है। इस संदर्भ के लिए तुलना संचालकों पर इसी तरह की जानकारी यहां पाई जा सकती है: stackoverflow.com/questions/10849297/… - मैंने आगे के लिंक में अनुशंसित के रूप में ()) मूल्यांकन ऑपरेटर के साथ चक्क किया, लेकिन यह मेरे न्यूनतम इनवेसिव परिवर्तनों / के लिए विफल लग रहा था / या कोड परिवर्तन के लिए बहुत गहरे स्तर की आवश्यकता होगी। softpanorama.org/Scripting/Shellorama/Control_structures/…
अलेक्जेंडर स्टोह

3

स्क्रिप्ट चलाने के दौरान श के बजाय बैश निर्दिष्ट करें। मैंने व्यक्तिगत रूप से देखा कि वे ubuntu 12.10 के तहत अलग हैं:

bash script.sh arg0 ... argn


यह मेरे लिए यह तय!
जिमिल्लाह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.