Stringvergleich in Bash. [[: nicht gefunden

164

Ich versuche, Strings in Bash zu vergleichen. Ich habe bereits eine Antwort gefunden, wie es beim Stackoverflow geht . In dem Skript, das ich versuche, verwende ich den von Adam in der genannten Frage eingereichten Code:

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

Ich habe auch versucht, Ansatz von Ubuntuforums , die Sie im 2. Beitrag finden können

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

In beiden Fällen erhalte ich folgende Fehlermeldung:

[[: not found

Was mache ich falsch?

user1581900
quelle
Ich könnte es falsch machen, aber die Verwendung einer einzelnen eckigen Klammer hat bei mir immer funktioniert.
Markus Unterwaditzer
1
Was /bin/bash --versiondruckt?
themel
4
[funktioniert in diesem Fall nicht, da es keine Muster unterstützt.
Ansgar Wiechers

Antworten:

156

[[ist ein Bash-Builtin. Ihr /bin/bashscheint kein wirklicher Schlag zu sein.

Ansgar Wiechers
quelle
Wenn ich
tippe
5
Erhalten Sie das gleiche Ergebnis, wenn Sie laufen /bin/bash -c "type [["?
Ansgar Wiechers
42
Dies geschah mir, weil ich vergessen hatte, #!/bin/bashoben in meiner Datei
hinzuzufügen
12
Passiert mir, weil ich das Drehbuch mit shviel Frust ausgeführt habe. Jetzt muss ich nur noch alles wiederholen, was ich gelöst habe, bevor ich diese Antwort finde.
Louis Loudog Trottier
174

Wie führen Sie Ihr Skript aus? Wenn du es getan hast

$ sh myscript

du solltest es versuchen:

$ bash myscript

oder, wenn das Skript ausführbar ist:

$ ./myscript

sh und bash sind zwei verschiedene Muscheln . Während Sie im ersten Fall Ihr Skript als Argument an den sh-Interpreter übergeben, entscheiden Sie im zweiten Fall in der ersten Zeile, welcher Interpreter verwendet wird.

Akos K.
quelle
Auf diese Weise wurde mir die Erlaubnis verweigert. mit sudo ./myscript sein Befehl nicht gefunden
user1581900
11
mache chmod + x myscript , dann starte es erneut, du brauchst kein sudo
Akos K
2
Wie rufen Sie Ihr Skript auf?
Akos K
wie du gesagt hast. Normalerweise nenne ich es mit '$ sh myscipt.sh'. 2. Mal nach chmod + x myscript.sh rief ich es mit ./myscript.sh
user1581900
5
Der Fehler wird erwartet, wenn Sie das Skript über ausführen sh myscript.sh, da /bin/sheine Bourne-Shell emuliert wird, in der [[es sich nicht um eine integrierte Shell handelt. Das Ausführen des Skripts über ./script.shsollte jedoch keinen Fehler ergeben, da in diesem Fall der Shebang die Verwendung veranlassen /bin/bashsollte.
Ansgar Wiechers
81

Ist die erste Zeile in Ihrem Skript:

#!/bin/bash

oder

#!/bin/sh

Die sh-Shell erzeugt diese Fehlermeldungen, nicht bash

Wiley
quelle
1
Die erste Zeile fehlte mir auch, als ich den vom Autor erwähnten Fehler verursachte!
Anonym
13

Ich hatte dieses Problem bei der Installation von Heroku Toolbelt

So habe ich das Problem gelöst

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

Wie Sie sehen können, ist / bin / sh ein Link zu "dash" (nicht bash) und [[ist bash syntaktischer Zucker. Also habe ich gerade den Link zu / bin / bash ersetzt. Vorsichtig mit rm wie diesem in Ihrem System!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
jperelli
quelle
6
Das Überschreiben der Standardeinstellung shfür Ihre Distribution ist meiner Meinung nach nicht ratsam. Eine Shell, mit der ausgeführt wird, shsollte funktionieren dash. Wenn nicht, ist das ein Fehler im Skript. Wenn Sie bashFunktionen benötigen , verwenden Sie bashnicht sh.
Tripleee
4
das klingt schrecklich tbh
MrVaykadji
2
Ich stimme zu, es war nur eine hässliche Problemumgehung. Eine ähnliche, aber bessere Problemumgehung wäre die Verwendung update-alternatives(unter Debian-basiertem Linux) wie dieses justinconover.wordpress.com/2012/05/14/…, aber am Ende wäre es dasselbe.
Jperelli
13

Wie @Ansgar erwähnte, [[handelt es sich um einen Bashismus, der in Bash eingebaut ist und für andere Shells nicht verfügbar ist. Wenn Sie möchten, dass Ihr Skript portabel ist, verwenden Sie [. Vergleiche benötigen auch eine andere Syntax: Ändern Sie ==zu =.

Amedee Van Gasse
quelle
Überprüfte ein wenig mit Ubuntu 16.04 und (sh ->) dash 0.5.8-2.1ubuntu2 und stellte fest, dass [in Kombination mit "-eq" und ähnlichen Funktionen gut funktioniert. Ähnliche Informationen zu Vergleichsoperatoren für diesen Kontext finden Sie hier: stackoverflow.com/questions/10849297/… - Ich habe mich weiter mit dem (()) Evaluierungsoperator befasst, wie im nächsten Link empfohlen, aber das schien für meine minimalen invasiven Änderungen fehlzuschlagen. oder / es würde eine viel tiefere Ebene von Codeänderungen erfordern. softpanorama.org/Scripting/Shellorama/Control_structures/…
Alexander Stohr
3

Geben Sie beim Ausführen des Skripts bash anstelle von sh an. Mir persönlich ist aufgefallen, dass sie unter Ubuntu 12.10 unterschiedlich sind:

bash script.sh arg0 ... argn

Smeterlink
quelle
Das hat es für mich behoben!
Djamillah