Сравнение строк в bash. [[: не найдено

Я пытаюсь сравнить строки в bash. Я уже нашел ответ о том, как это сделать на qaru.site/info/833/.... В script Я пытаюсь, я использую код, представленный Адамом в указанном вопросе:

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

Я также попробовал подход из ubuntuforums, который вы можете найти в 2-м посте

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

В обоих случаях я получаю сообщение об ошибке:

[[: not found

Что я делаю неправильно?

Ответ 1

[[ представляет собой bash -builtin. Ваш /bin/bash не является фактическим bash.

Ответ 2

Как вы используете script? Если вы сделали с

$ sh myscript

вы должны попробовать:

$ bash myscript

или, если script выполним:

$ ./myscript

sh и bash являются двумя различными оболочками. Хотя в первом случае вы передаете свой script в качестве аргумента для интерпретатора sh, во втором случае вы выбираете первую строку, в которой будет использоваться интерпретатор.

Ответ 3

Является первой строкой в ​​ script:

#!/bin/bash

или

#!/bin/sh

оболочка sh создает эти сообщения об ошибках, а не bash

Ответ 4

У меня возникла эта проблема при установке Heroku Toolbelt

Вот как я решил проблему

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

Как вы можете видеть, /bin/sh - это ссылка на "тире" (не bash), а [[ - bash синтаксическая сахара. Поэтому я просто заменил ссылку на /bin/ bash. Осторожно, используя rm в вашей системе!

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

Ответ 5

Как упоминал @Ansgar, [[ - это багизм, т.е. встроенный в Bash и недоступный для других оболочек. Если вы хотите, чтобы ваш script был переносимым, используйте [. Для сравнения также потребуется другой синтаксис: change == to =.

Ответ 6

Задайте bash вместо sh при запуске script. Я лично заметил, что они отличаются от ubuntu 12.10:

bash script.sh arg0 ... argn