web-dev-qa-db-de.com

String-Vergleich in Bash. [[: nicht gefunden

Ich versuche, Zeichenfolgen in Bash zu vergleichen. Ich habe bereits eine Antwort gefunden, wie es geht stackoverflow . Im Skript, das ich versuche, verwende ich den Code, der von Adam in der genannten Frage übermittelt wurde:

#!/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 buntuforums , die Sie im 2. Beitrag finden

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

In beiden Fällen erhalte ich eine Fehlermeldung:

[[: not found

Was mache ich falsch?

130
user1581900

[[ ist ein Bash-Builtin. Ihre /bin/bash scheint keine wirkliche Bash zu sein.

120
Ansgar Wiechers

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

$ sh myscript

du solltest es versuchen:

$ bash myscript

oder, wenn das Skript ausführbar ist:

$ ./myscript

sh und bash sind zwei verschiedene Shells . 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.

149
Akos K

Ist die erste Zeile in Ihrem Skript:

#!/bin/bash

oder

#!/bin/sh

die sh-Shell erzeugt diese Fehlermeldungen, nicht Bash

75
Wiley

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 syntaktische Zucker. Also habe ich nur den Link zu/bin/bash ersetzt. Vorsicht bei der Verwendung von rm in Ihrem System!

$ Sudo rm /bin/sh
$ Sudo ln -s /bin/bash /bin/sh
14
jperelli

Wie @Ansgar erwähnt, [[ ist ein Bashismus, dh in Bash eingebaut und nicht für andere Shells verfügbar. Wenn Sie möchten, dass Ihr Skript portierbar ist, verwenden Sie [. Vergleiche benötigen auch eine andere Syntax: change == bis =.

8

Geben Sie bash anstelle von sh an, wenn Sie das Skript ausführen. Ich persönlich habe festgestellt, dass sie unter Ubuntu 12.10 unterschiedlich sind:

bash script.sh arg0 ... argn

3
Smeterlink