Я пытаюсь сравнить строки в 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, который вы можете найти во втором посте
if [[ $var =~ regexp ]]; then
#do something
fi
В обоих случаях я получаю сообщение об ошибке:
[[: not found
Что я делаю не так?
bash
shell
ubuntu-11.04
string-comparison
user1581900
источник
источник
/bin/bash --version
печатает?[
не будет работать в этом случае, потому что он не поддерживает шаблоны.Ответы:
[[
это встроенный Bash. Вы/bin/bash
, кажется, не настоящий удар.Из комментария:
Добавить
#!/bin/bash
в начало файлаисточник
/bin/bash -c "type [["
?#!/bin/bash
в начало моего файлаsh
большим разочарованием. Теперь мне нужно переделать все, что я отменил, прежде чем найти этот ответ.Как у вас работает скрипт? Если вы сделали с
Ты должен попытаться:
или, если скрипт исполняемый:
sh и bash - это две разные оболочки . Если в первом случае вы передаете свой сценарий в качестве аргумента интерпретатору sh, во втором случае вы решаете в самой первой строке, какой интерпретатор будет использоваться.
источник
sh myscript.sh
, потому что/bin/sh
эмулирует оболочку Bourne, где[[
она не является встроенной. Тем не менее, запуск сценария через./script.sh
не должен привести к ошибке, потому что в этом случае должен/bin/bash
быть использован shebang .Первая строка в вашем скрипте:
или
оболочка sh выдает эти сообщения об ошибках, а не bash
источник
У меня была эта проблема при установке Heroku Toolbelt
Вот так я решил проблему
Как вы можете видеть, / bin / sh является ссылкой на «dash» (не bash) и
[[
является синтаксической сахарностью bash. Поэтому я просто заменил ссылку на / bin / bash. Осторожно используйте rm как это в вашей системе!источник
sh
для вашего дистрибутива является ИМХО опрометчивым. Оболочка, с которой запускается,sh
должна работатьdash
; если это не так, это ошибка в скрипте. Если вам нужныbash
функции, используйтеbash
, а неsh
.update-alternatives
(в debian-based-linux) как этот justinconover.wordpress.com/2012/05/14/… но в конце концов, это будет то же самое.Как упомянул @Ansgar,
[[
это bashism, то есть встроенный в Bash и недоступный для других оболочек. Если вы хотите, чтобы ваш скрипт был переносимым, используйте[
. Для сравнения также потребуется другой синтаксис: изменить==
на=
.источник
Укажите bash вместо sh при запуске скрипта. Я лично заметил, что они разные под Ubuntu 12.10:
bash script.sh arg0 ... argn
источник