Próbuję porównać struny w bash. Znalazłem już odpowiedź, jak to zrobić na stackoverflow . W skrypcie, który próbuję, korzystam z kodu przesłanego przez Adama we wspomnianym pytaniu:
#!/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 też podejścia z ubuntuforum , które można znaleźć w 2 poście
if [[ $var =~ regexp ]]; then
#do something
fi
W obu przypadkach pojawia się błąd:
[[: not found
Co ja robię źle?
bash
shell
ubuntu-11.04
string-comparison
user1581900
źródło
źródło
/bin/bash --version
drukuje?[
nie zadziała w tym przypadku, ponieważ nie obsługuje wzorców.Odpowiedzi:
[[
jest wbudowanym bashem. Twój/bin/bash
nie wydaje się być prawdziwym bashem.źródło
/bin/bash -c "type [["
?#!/bin/bash
na górze mojego plikush
, dużo frustracji. Teraz muszę tylko powtórzyć wszystko, co rozwiązałem, zanim znajdę tę odpowiedź.Jak uruchamiasz swój skrypt? Jeśli zrobiłeś z
powinieneś spróbować:
lub, jeśli skrypt jest wykonywalny:
sh i bash to dwie różne powłoki . Podczas gdy w pierwszym przypadku przekazujesz swój skrypt jako argument do interpretera sh, w drugim przypadku decydujesz już w pierwszej linii, który interpreter będzie używany.
źródło
sh myscript.sh
, ponieważ/bin/sh
emuluje powłokę Bourne'a, w której[[
nie jest wbudowana. Jednak uruchomienie skryptu przez./script.sh
nie powinno spowodować błędu, ponieważ w takim przypadku należy/bin/bash
użyć shebang .To pierwsza linia w twoim skrypcie:
lub
powłoka sh generuje te komunikaty o błędach, a nie bash
źródło
Miałem ten problem podczas instalacji Heroku Toolbelt
W ten sposób rozwiązałem problem
Jak widać, / bin / sh jest linkiem do "myślnika" (nie basha) i
[[
jest syntaktyczną cukrem basha. Więc właśnie podmieniłem link do / bin / bash. Ostrożnie używaj rm w swoim systemie!źródło
sh
dla twojej dystrybucji jest nierozsądne IMHO. Powłoka, z którą jest uruchamiana,sh
powinna działaćdash
; jeśli tak nie jest, oznacza to błąd w skrypcie. Jeśli potrzebujeszbash
funkcji, użyjbash
, a niesh
.update-alternatives
(w Linuksie opartym na Debianie ) takiego, jak to: justinconover.wordpress.com/2012/05/14/ ... ale ostatecznie byłoby tak samo.Jak wspomniał @Ansgar,
[[
jest to bashizm, tj. Wbudowany w Bash i niedostępny dla innych powłok. 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=
.źródło
Podczas uruchamiania skryptu określ bash zamiast sh. Osobiście zauważyłem, że różnią się one pod Ubuntu 12.10:
bash script.sh arg0 ... argn
źródło