2012-09-01 7 views
84

] Ich versuche, Strings in bash zu vergleichen. Ich habe bereits eine Antwort gefunden auf stackoverflow. In Skript Ich versuche, verwende ich den Code von Adam in der genannten Frage gestellt:String-Vergleich in bash. [[: nicht gefunden

#!/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 auch Ansatz versucht, aus ubuntuforums, die Sie im zweiten Beitrag

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

In beiden Fällen finden kann ich Fehler empfangen:

[[: not found 

Was mache ich falsch?

+0

Ich könnte es falsch machen, aber mit einer einzigen eckigen Klammer immer für mich gearbeitet. –

+1

Was wird '/ bin/bash --version' gedruckt? – themel

+0

GNU bash, Version 4.2.8 (1) – user1581900

Antwort

73

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

+0

Wenn ich tippe: type '[[' i get [[ist ein Shell-Schlüsselwort – user1581900

+5

Erhalten Sie das gleiche Ergebnis, wenn Sie '/ bin/bash -c 'ausführen [[" "? –

+0

Ja. [[ist ein Shell-Schlüsselwort – user1581900

94

Wie läuft Ihr Skript? Wenn Sie mit tat

$ sh myscript 

Sie sollten versuchen:

$ bash myscript 

oder, wenn das Skript ausführbar ist:

$ ./myscript 

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

+0

hinzuzufügen, ich habe die Erlaubnis verweigert auf diese Weise. mit sudo ./myscript sein Befehl nicht gefunden – user1581900

+10

tun ** chmod + x myscript **, dann wieder ausführen, Sie brauchen nicht sudo –

+0

Ich erhalte den gleichen Fehler. [[: nicht gefunden – user1581900

57

Ist die erste Zeile in Ihrem Skript:

#!/bin/bash 

oder

#!/bin/sh 

die sh-Shell diese Fehlermeldungen erzeugt, nicht bash

+1

das reparierte es für mich! Danke^_^ – Kayvar

+1

Die erste Zeile fehlte auch, weil ich den Fehler, den der Autor erwähnt hat, produziert habe! – Anonymous

11

ich dieses Problem hatte, als Heroku Toolbelt

Installation So habe ich das Problemgelöst
$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash 

Wie Sie sehen können,/bin/sh ist ein Link zu "Strich" (nicht bash) und [[ ist bash syntaktischen sugarness. Also habe ich gerade den Link zu/bin/bash getauscht. Vorsichtig mit rm wie in Ihrem System!

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

Das Überschreiben des Standard-'sh' für Ihre Distribution ist IMHO nicht ratsam. Eine Shell, die mit 'sh' ausgeführt wird, sollte mit' dash' arbeiten; Wenn nicht, ist das ein Fehler im Skript. Wenn Sie 'bash'-Funktionen benötigen, verwenden Sie' bash', nicht 'sh'. – tripleee

+2

das klingt schrecklich tbh – MrVaykadji

+0

Ich stimme zu, es war nur ein hässlicher Workaround. Eine ähnliche, aber bessere Problemumgehung wäre, 'update-alternatives' (in debian-based-linux) wie dieses zu verwenden https://justinconover.wordpress.com/2012/05/14/ubuntu-changing-dash-to-bash/ aber am Ende wäre es dasselbe. – jperelli

3

Geben Sie bash statt sh wenn das Skript ausgeführt wird. Ich persönlich bemerkt sie unter ubuntu verschieden 12.10:

bash script.sh arg0 ... argn

+0

Das hat es für mich behoben! – Djamillah

6

Wie @Ansgar erwähnt, [[ ein bashism, dh in Bash gebaut und nicht für andere Muscheln. Wenn Sie möchten, dass Ihr Skript portabel ist, verwenden Sie [. Vergleiche benötigen auch eine andere Syntax: Ändern Sie == zu =.