No bash, como posso verificar se uma string começa com algum valor? DoCow
bash comparação string
Configurando o log do Hibernate usando o arquivo de configuração Log4j XML? No PHP, o que é um fechamento e por que ele usa o identificador "use"? Ouvintes da GUI Java sem AWT Configurando o JDK no Eclipse Excluir item da matriz e da matriz de redução {" não era esperado.} Desserializando o Twitter XML Mesmos dados de entidades diferentes no database – Prática recomendada – Exemplo de números de telefone Dados jqGrid armazenados no cache do navegador? Maneira de saber se o usuário clicou em Cancelar em uma checkbox de diálogo Javascript onbeforeunload? Cálculo duplo produzindo resultado ímpar Tipo ou nome do namespace não existe com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Falha no link de comunicação Data do formato AAAA-MM-DD no shell script Quando usar .Primeiro e quando usar .FirstOrDefault com LINQ? System.Threading.Tasks – Limita o número de tarefas simultâneas
Eu gostaria de verificar se uma string começa com "nó", por exemplo, "node001". Algo como
Eu ainda preciso combinar expressões para verificar se o HOST é "user1" ou começa com "node"
Este snippet no Guia Avançado de Script Bash diz:
Então você tinha quase correto; você precisava de colchetes duplos , não de colchetes únicos.
Com relação à sua segunda pergunta, você pode escrever desta maneira:
Que vai ecoar
Bash if syntax é difícil de se acostumar (IMO).
Se você estiver usando uma recente bash (v3 +) sugira bash regex comparison operator =~ , ie
Para combinar this or that em um uso regex | ou seja
Nota – esta é a syntax de expressão regular 'adequada'.
user* significa use e zero ou mais ocorrências de r , então use e userrrr corresponderá.
user.* significa user e zero ou mais ocorrências de qualquer caractere, então user1 , userX corresponderá.
^user.* significa corresponder ao user.* padrão user.* no início de $ HOST.
Se você não estiver familiarizado com a syntax da expressão regular, tente se referir a esse recurso .
Nota – é melhor se você perguntar a cada nova pergunta como uma nova pergunta, tornar o stackoverflow mais arrumado e mais útil. Você sempre pode include um link para uma pergunta anterior para referência.
Eu sempre tento ficar com POSIX sh em vez de usar extensões bash, já que um dos principais pontos de script é a portabilidade. (Além de conectar programas, não substituí-los)
Em sh, há uma maneira fácil de verificar uma condição "é-prefixo".
Dada a idade, arca e crufty sh é (e bash não é a cura: é mais complicado, menos consistente e menos portável), eu gostaria de destacar um aspecto funcional muito bom: enquanto alguns elementos de syntax como case são construídos in, as construções resultantes não são diferentes de qualquer outro trabalho. Eles podem ser compostos da mesma maneira:
Ou ainda mais curto
Ou ainda mais curto (apenas para apresentar ! Como um elemento de linguagem – mas agora é um estilo ruim)
Se você gosta de ser explícito, crie seu próprio elemento de linguagem:
Isso não é realmente muito bom?
E como sh é basicamente apenas jobs e listas de strings (e internamente processos, dos quais jobs são compostos), agora podemos até fazer alguma functional programming light:
Isso é elegante. Não que eu defenda o uso do sh para algo sério – ele quebra muito rapidamente os requisitos do mundo real (não lambdas, portanto, deve usar strings. Mas aninhar chamadas de function com strings não é possível, pipes não são possíveis …)
Você pode selecionar apenas a parte da string que deseja verificar:
Para sua pergunta de acompanhamento, você pode usar um OR :
Eu prefiro os outros methods já postados, mas algumas pessoas gostam de usar:
Eu adicionei seus suplentes à declaração de caso acima
Na sua versão editada, você tem muitos colchetes. Deve ficar assim:
desde # tem um significado na bash eu cheguei à seguinte solução.
Além disso, gosto de empacotar cordas com "" para superar espaços, etc.
Embora eu ache a maioria das respostas aqui corretas, muitas delas contêm bashisms desnecessários. A expansão do parâmetro POSIX oferece tudo o que você precisa:
${var#expr} retira o menor prefixo correspondente expr de ${var} e retorna isso. Portanto, se ${host} não iniciar com o user ( node ), ${host#user} ( ${host#node} ) será o mesmo que ${host} .
expr permite curingas fnmatch() , assim ${host#node??} e os amigos também trabalham.
@OP, para ambas as suas dúvidas você pode usar case / esac
OU Bash 4.0
não funciona, porque todos [ , [[ e teste reconhecem a mesma gramática não-recursiva. veja a seção EXPRESSÕES CONDICIONAIS na sua página man bash.
Como um aparte, o SUSv3 diz
O comando condicional derivado do KornShell (colchete duplo [[]] ) foi removido da descrição do idioma do comando shell em uma proposta inicial. Objeções foram levantadas que o problema real é o uso incorreto do comando de teste ( [ ), e colocá-lo no shell é a maneira errada de corrigir o problema. Em vez disso, documentação adequada e uma nova palavra reservada shell ( ! ) São suficientes.
Testes que exigem várias operações de teste podem ser feitos no nível do shell usando invocações individuais do comando de teste e lógicas do shell, em vez de usar o sinalizador -o de teste propenso a erros.
você precisaria escrever dessa maneira, mas o teste não suporta:
usos de teste = para igualdade de strings, mais importante, não suporta correspondência de padrões.
case / esac tem um bom suporte para correspondência de padrões:
tem o benefício adicional de não depender de bash, a syntax é portátil. da Especificação Unix Única, A Linguagem de Comandos do Shell:
Adicionando um pouco mais de detalhes de syntax à resposta mais alta de Mark Rushakoff.
Também pode ser escrito como
O efeito é o mesmo. Apenas certifique-se de que o caractere curinga esteja fora do texto citado. Se o curinga estiver dentro das aspas, ele será interpretado literalmente (ou seja, não como curinga).
Outra coisa que você pode fazer é eliminar o que está ecoando e canalizar com o inline cut -c 1-1 – inline cut -c 1-1