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


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

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

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

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

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

[[: not found

что я делаю не так?

6 99

6 ответов:

[[ - Это Баш-встроенные. Ваш /bin/bash Не кажется, что это настоящий Баш.

как вы запускаете свой скрипт? Если вы сделали с

$ sh myscript

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

$ bash myscript

или, если скрипт исполняемым:

$ ./myscript

ш и Баш два разных снарядов. В то время как в первом случае вы передаете свой скрипт в качестве аргумента интерпретатору sh, во втором случае вы решаете на самой первой строке, какой интерпретатор будет использоваться.

Это первая строка в скрипте:

#!/bin/bash

или

#!/bin/sh

оболочка sh выдает это сообщение об ошибке, а не bash

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

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

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

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

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

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

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

bash script.sh arg0 ... argn