2012-09-01 9 views
84

Próbuję porównać ciągi w bash. Znalazłem już odpowiedź na pytanie, jak to zrobić na stackoverflow. W skrypcie Próbuję używam kod przekazany przez Adama we wspomnianym pytaniem:Porównanie łańcuchów w bashu. [[: nie znaleziono

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

Próbowałem również podejście z ubuntuforums, które można znaleźć w 2 poście

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

w obu przypadkach błąd:

[[: not found 

Co robię źle?

+0

Mogłem zrobić to źle, ale użycie pojedynczego kwadratowego wspornika zawsze działało dla mnie. –

+1

Co znaczy "/ bin/bash --version"? – themel

+0

GNU bash, wersja 4.2.8 (1) – user1581900

Odpowiedz

73

[[ jest bash-builtin. Twoja /bin/bash nie wydaje się być rzeczywistą bashą.

+0

jeśli napiszę: wpisz "[[" otrzymam [[jest słowem kluczowym powłoki – user1581900

+5

Czy otrzymasz taki sam wynik, gdy uruchomisz typ '/ bin/bash -c" [[? –

+0

Tak. [[to słowo kluczowe powłoki – user1581900

94

W jaki sposób uruchamiasz swój skrypt? Jeśli tak ze

$ sh myscript 

należy spróbować:

$ bash myscript 

lub, jeśli skrypt jest wykonywalny:

$ ./myscript 

sh i bash są dwa different shells. Podczas gdy w pierwszym przypadku przekazujesz swój skrypt jako argument do interpretera sh, w drugim przypadku decydujesz o pierwszej linii, której tłumacz będzie użyty.

+0

otrzymałem odmowę zgody w ten sposób. z sudo ./myscript jego polecenie nie zostało znalezione – user1581900

+10

do ** chmod + x myscript **, następnie uruchom ponownie, nie potrzebujesz sudo –

+0

Otrzymuję ten sam błąd. [[: nie znaleziono – user1581900

57

jest pierwszą linią w skrypcie:

#!/bin/bash 

lub

#!/bin/sh 

powłoki sh produkuje to komunikaty o błędach, nie bash

+1

to naprawiło to dla mnie! dzięki^_^ – Kayvar

+1

Pierwsza linia była również brakująca dla mnie, powodując błąd, o którym wspomniał autor! – Anonymous

11

miałem ten problem podczas instalowania Heroku Toolbelt

Oto jak rozwiązałem problem

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

Jak widać,/bin/sh jest link do "kreska" (nie bash) i [[ bash składniowym sugarness. Więc właśnie zamieniłem link na/bin/bash. Uważaj, używając rm w swoim systemie!

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

Zastępowanie domyślnego 'sh' dla twojej dystrybucji to nierozsądna wiadomość IMHO. Powłoka uruchamiana przez 'sh' powinna działać z' dash'; jeśli nie, jest to błąd w skrypcie. Jeśli potrzebujesz funkcji 'bash', użyj' bash', a nie 'sh'. – tripleee

+2

to brzmi okropnie tbh – MrVaykadji

+0

Zgadzam się, to było tylko brzydkie obejście. Podobnym, ale lepszym obejściem byłoby użycie 'update-alternatives' (w debian-based-linux), tak jak to https://justinconover.wordpress.com/2012/05/14/ubuntu-changing-dash-to-bash/ ale w końcu byłoby tak samo. – jperelli

3

Podaj bash zamiast sh podczas uruchamiania skryptu. Osobiście zauważyłem są one różne pod Ubuntu 12.10:

bash script.sh arg0 ... argn

+0

Naprawiono to dla mnie! – Djamillah

6

Jak wspomniano @Ansgar, [[ jest składnią Basha, czyli wbudowane w Basha i nie są dostępne dla innych skorup. Jeśli chcesz, aby twój skrypt był przenośny, użyj [. Porównania będą również wymagały innej składni: zmień == na =.