Estou tentando comparar seqüências de caracteres no bash. Eu já encontrei uma resposta sobre como fazê-lo no stackoverflow . No script que estou tentando, estou usando o código enviado por Adam na pergunta mencionada:
#!/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
Eu também tentei abordagem do ubuntuforums que você pode encontrar no segundo post
if [[ $var =~ regexp ]]; then
#do something
fi
Nos dois casos, recebo erro:
[[: not found
O que estou fazendo de errado?
bash
shell
ubuntu-11.04
string-comparison
user1581900
fonte
fonte
/bin/bash --version
imprime?[
não funcionará neste caso, porque não suporta padrões.Respostas:
[[
é um bash-builtin. Sua/bin/bash
não parece ser uma festa real.De um comentário:
Adicionar
#!/bin/bash
na parte superior do arquivofonte
/bin/bash -c "type [["
?#!/bin/bash
na parte superior do meu arquivosh
muita frustração. Agora só preciso refazer tudo o que desfiz antes de encontrar esta resposta.Como você está executando seu script? Se você fez com
Você deveria tentar:
ou, se o script for executável:
sh e bash são duas conchas diferentes . Enquanto no primeiro caso você está passando seu script como argumento para o intérprete sh, no segundo caso você decide na primeira linha qual intérprete será usado.
fonte
sh myscript.sh
, porque/bin/sh
emula um shell Bourne onde[[
não está embutido. No entanto, a execução do script via./script.sh
não deve gerar um erro, pois nesse caso o shebang deve causar o/bin/bash
uso.É a primeira linha do seu script:
ou
o sh shell produz essas mensagens de erro, não o bash
fonte
Eu tive esse problema ao instalar o Heroku Toolbelt
Foi assim que resolvi o problema
Como você pode ver, / bin / sh é um link para "dash" (não bash), e
[[
é uma sacralidade sintática. Acabei de substituir o link para / bin / bash. Cuidado usando rm como este em seu sistema!fonte
sh
da sua distribuição é IMHO mal recomendado. Um shell que é executado comsh
deve trabalhar comdash
; caso contrário, isso é um bug no script. Se você precisar debash
recursos, usebash
, nãosh
.update-alternatives
(no debian-linux) como este justinconover.wordpress.com/2012/05/14/… mas no final, seria o mesmo.Como @Ansgar mencionou,
[[
é um basismo, ou seja, embutido no Bash e não disponível para outras conchas. Se você deseja que seu script seja portátil, use[
. As comparações também precisarão de uma sintaxe diferente: altere==
para=
.fonte
Especifique bash em vez de sh ao executar o script. Pessoalmente, notei que eles são diferentes no ubuntu 12.10:
bash script.sh arg0 ... argn
fonte