Ответ 1
[[
представляет собой bash -builtin. Ваш /bin/bash
не является фактическим 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
Что я делаю неправильно?
[[
представляет собой bash -builtin. Ваш /bin/bash
не является фактическим bash.
Как вы используете script? Если вы сделали с
$ sh myscript
вы должны попробовать:
$ bash myscript
или, если script выполним:
$ ./myscript
sh и bash являются двумя различными оболочками. Хотя в первом случае вы передаете свой script в качестве аргумента для интерпретатора sh, во втором случае вы выбираете первую строку, в которой будет использоваться интерпретатор.
Является первой строкой в script:
#!/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), а [[
- bash синтаксическая сахара. Поэтому я просто заменил ссылку на /bin/ bash. Осторожно, используя rm в вашей системе!
$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
Как упоминал @Ansgar, [[
- это багизм, т.е. встроенный в Bash и недоступный для других оболочек. Если вы хотите, чтобы ваш script был переносимым, используйте [
. Для сравнения также потребуется другой синтаксис: change ==
to =
.
Задайте bash вместо sh при запуске script. Я лично заметил, что они отличаются от ubuntu 12.10:
bash script.sh arg0 ... argn